我对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
,则不会发生应用程序层缓冲。如果您从另一个进程查看文件,则会看到数据,但这并不意味着它们已提交到磁盘,因为内核中发生了一层缓冲。由于内核正在处理来自另一个进程的访问,因此它将内核中的数据报告给另一个进程。换句话说,从所有用户空间应用程序的角度来看,数据已被写入文件,但实际上并没有到达磁盘。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句