当前位置: 技术问答>linux和unix
请教一个进程读写文件的问题
来源: 互联网 发布时间:2016-07-15
本文导语: #include const char testfile[]= "test_file.txt"; const char msg1[] = "Testn"; const char msg2[] = "Hellon"; int main() { int fd, pid; FILE *fp; if ( ( fp = fopen( testfile, "w" ) ) == NULL ) return 1; ...
#include
const char testfile[]= "test_file.txt";
const char msg1[] = "Testn";
const char msg2[] = "Hellon";
int main()
{
int fd, pid;
FILE *fp;
if ( ( fp = fopen( testfile, "w" ) ) == NULL )
return 1;
fprintf( fp, "%s", msg1 );
if ( ( pid = fork() ) == -1 )
return 3;
fprintf( fp, "%s", msg2 );
close( fp );
return 0;
}
问题: 文件test_file.txt中的内容是什么? 并请给出解释.
|
实验过,对第一个程序有两种结果:
Test
Hello
Test
Hello
跟
Test
Hello
对第一个程序的解释,APUE里面好像有解释,(不知道有没有记错)。那是因为fork出来的进程复制了一份父进程的buffer,这时候还没有真正把buffer写到硬盘。所以子进程里也有一份Test的buffer,然后等到两个进程都退出以后,buffer都被flush了。
但我的机器出现了第二种结果,我同事的只有第一个结果。
另外,这个的确因该还跟时序有关系。
Test
Hello
Test
Hello
跟
Test
Hello
对第一个程序的解释,APUE里面好像有解释,(不知道有没有记错)。那是因为fork出来的进程复制了一份父进程的buffer,这时候还没有真正把buffer写到硬盘。所以子进程里也有一份Test的buffer,然后等到两个进程都退出以后,buffer都被flush了。
但我的机器出现了第二种结果,我同事的只有第一个结果。
另外,这个的确因该还跟时序有关系。
|
本来跟8楼一样,我也觉得是
Test
Hello
Hello
看了7楼的解释,我知道3楼的答案了,fopen是缓冲打开文件,open是非缓冲打开文件。
用fopen时fork后子进程中有一份缓冲,程序结束时写入文件,是两份。故为
Test
Hello
Test
Hello
而用open打开文件时,是直接写入是
Test
Hello
Hello
Test
Hello
Hello
看了7楼的解释,我知道3楼的答案了,fopen是缓冲打开文件,open是非缓冲打开文件。
用fopen时fork后子进程中有一份缓冲,程序结束时写入文件,是两份。故为
Test
Hello
Test
Hello
而用open打开文件时,是直接写入是
Test
Hello
Hello