C语言 已缓冲io与未缓冲io之间的差异



我有一个关于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;
   }

我认为在睡眠期间应该没有任何输出,但事实恰恰相反。
有什么我误解了吗?

有多层缓冲。如果调用write,则不会发生应用层缓冲。如果您查看来自另一个进程的文件,您将看到数据,但这并不意味着它们已提交到磁盘,因为内核中存在一层缓冲。由于内核正在处理来自其他进程的访问,因此它将缓冲区中的数据报告给其他进程。换句话说,从所有用户空间应用程序的角度来看,数据已经写入文件,但实际上还没有到达磁盘。

最新更新