Linux 软岩的解剖
我用C写了一个小程序Linux 软岩的解剖,linux,file,file-io,filesystems,Linux,File,File Io,Filesystems,我用C写了一个小程序 FILE *fp = fopen("/tmp/file", "w+"); char *buf = "hello"; fwrite(buf, 1, strlen(buf), fp); for(;;); 在我使用cat读取内容的shell上,文件是空的,因为没有调用fflush。我的问题是,它会永远保持这种状态,还是会在某个时候将数据推送到磁盘 换句话说,fwrite调用是否跨越文件系统边界到VM子系统,如果是,则应在某个时候调用页面守护进程,这将刷新文件的内容。否则,数据将
FILE *fp = fopen("/tmp/file", "w+");
char *buf = "hello";
fwrite(buf, 1, strlen(buf), fp);
for(;;);
在我使用cat读取内容的shell上,文件是空的,因为没有调用fflush。我的问题是,它会永远保持这种状态,还是会在某个时候将数据推送到磁盘
换句话说,fwrite调用是否跨越文件系统边界到VM子系统,如果是,则应在某个时候调用页面守护进程,这将刷新文件的内容。否则,数据将永远保留在那里,直到文件关闭或刷新。fwrite在写入系统调用的顶部添加缓冲。此缓冲发生在客户端库(libc)中,因此在您的情况下,您可以永远等待,因为libc中没有异步线程运行,它自己进行刷新。fwrite在写入系统调用之上添加缓冲。此缓冲发生在客户端库(libc)中,因此在您的情况下,您可以永远等待,因为libc中没有异步线程运行,它自己进行刷新。文件*缓冲是在libc中实现的,因此答案是否定的:内核没有看到您的数据,而且永远不会看到。文件*缓冲是在libc中实现的,因此答案是否定的:内核没有看到您的数据,而且永远不会看到。每个stdio
文件都有一个内部缓冲区(请参阅以了解更多信息)。fwrite
或fprintf
或fputs
调用正在填充该缓冲区。只有当文件已满或调用fflush
时,才会将其写入文件系统(使用系统调用,在内核内执行)
您可能有行缓冲(例如,对于stdout),然后当缓冲区中出现换行符时,写入
另外,试着strace
你的程序来理解它在做什么
p.p.S Linux是自由软件:您可以研究的源代码,或者-我发现其源代码更容易阅读。每个stdio文件
都有一个内部缓冲区(有关更多信息,请参阅)。fwrite
或fprintf
或fputs
调用正在填充该缓冲区。只有当文件已满或调用fflush
时,才会将其写入文件系统(使用系统调用,在内核内执行)
您可能有行缓冲(例如,对于stdout),然后当缓冲区中出现换行符时,写入
另外,试着strace
你的程序来理解它在做什么
p.p.S Linux是自由软件:你可以研究的源代码,或者我发现它的源代码更容易阅读。你忘了在无限循环之前调用fflush(fp)
或者fclose(fp)
(你可以用睡眠来代替)。我故意这么做,我的目标是理解这里的系统,而不是在文件中写入hello:)您可以strace
您的程序来获取它正在执行的实际系统调用。经过验证,strace显示开放系统调用,但没有写入系统调用,因此内核永远不会知道写入操作。您忘记调用fflush(fp)
或fclose(fp)
在无限for
循环(你可以用睡眠
代替)之前。我故意这么做,我的目的是了解系统,而不是在文件中写入hello:)你可以扫描你的程序,以获得它正在执行的实际系统调用。经过验证,strace显示打开的系统调用,但没有写入系统调用,所以内核永远不知道写操作。