缓冲的io和无缓冲的io之间的区别

时间:2014-07-22 06:32:51

标签: c linux io buffer

我对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;
   }
我认为睡觉时应该没有任何东西,但事实恰恰相反 有什么我误解了吗?

1 个答案:

答案 0 :(得分:3)

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