gpt4 book ai didi

c - 缓冲 io 和非缓冲 io 之间的区别

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:37 24 4
gpt4 key购买 nike

我有一个关于 C 语言 I/O 编程中缓冲区的问题。
例如,人们总是说fwrite 是一个缓冲的i/o,而write 是一个非缓冲的i/o。我的理解是这里的“缓冲”是在应用层,我认为在内核级别,它们都有一个缓冲区。从 APUE,我看到:

Traditional implementations of the UNIX System havea buffer cache or page cache in the kernel throughwhich most disk I/O passes. When we write data to a file,the data is normally copied by the kernel into oneof its buffers and queued for writing to disk at some later time. This is called delayed write.

我说的对吗?所以我做了一个实验:

 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;
}

本以为sleep应该什么都不输出,结果恰恰相反。
我有什么误解吗?

最佳答案

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

关于c - 缓冲 io 和非缓冲 io 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24880376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com