Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 软岩的解剖_Linux_File_File Io_Filesystems - Fatal编程技术网

Linux 软岩的解剖

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子系统,如果是,则应在某个时候调用页面守护进程,这将刷新文件的内容。否则,数据将

我用C写了一个小程序

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显示打开的系统调用,但没有写入系统调用,所以内核永远不知道写操作。