我有一个关于 C 中 I/O 编程中的缓冲区的问题。
例如,总是说fwrite是一个缓冲的 i/o,而write是一个无缓冲的 i/o。我的理解是这里的“缓冲”是在应用程序层,我认为在内核级别,它们都有一个缓冲区。从 APUE,我看到:
UNIX 系统的传统实现在内核中具有缓冲区缓存或页面缓存,大多数磁盘 I/O 都通过这些缓存。当我们将数据写入文件时,数据通常由内核复制到其中一个缓冲区中,并排队等待稍后写入磁盘。这称为延迟写入。
我对吗?所以我做了一个实验:
int main() {
char *fname = "helloworld";
char content[] = "abcdefg";
int fd = open(fname, O_WRONLY | O_CREAT);
int flag = fcntl(fd, F_GETFL);
flag &= ~O_SYNC;
fcntl(fd, F_SETFL, flag);
write(fd, content, 3);
sleep(100);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我认为睡眠期间应该没有任何输出,但事实恰恰相反。
我有什么误解吗?
有多层缓冲。如果调用write,则不会发生应用层缓冲。如果您查看来自另一个进程的文件,您将看到数据,但这并不意味着它们已提交到磁盘,因为内核中有一层缓冲发生。由于内核正在处理来自其他进程的访问,因此它会将缓冲区中的数据报告给该其他进程。换句话说,从所有用户空间应用程序的角度来看,数据已写入文件,但实际上并未命中磁盘。