当前位置: 技术问答>linux和unix
有关fork和fprintf的问题
来源: 互联网 发布时间:2015-01-09
本文导语: fopen() while(1) { fprintf(); getch(); if(fork()==0) { do something.... exit(0); } } 这是程序的大体流程,我想在父进程中记录一些子进程的信息。可是父进程被终止(已经运行到getch())时,文件是空的...
fopen()
while(1)
{
fprintf();
getch();
if(fork()==0)
{
do something....
exit(0);
}
}
这是程序的大体流程,我想在父进程中记录一些子进程的信息。可是父进程被终止(已经运行到getch())时,文件是空的。子进程exit时,文件才有内容,但是每个子进程结束时,都把以前的信息重写一遍。有点像1+2+3+4+……。但我可以确信fprintf只执行了1+1+1+1+……遍,这是为什么,这和fprintf的实现有关吗?
while(1)
{
fprintf();
getch();
if(fork()==0)
{
do something....
exit(0);
}
}
这是程序的大体流程,我想在父进程中记录一些子进程的信息。可是父进程被终止(已经运行到getch())时,文件是空的。子进程exit时,文件才有内容,但是每个子进程结束时,都把以前的信息重写一遍。有点像1+2+3+4+……。但我可以确信fprintf只执行了1+1+1+1+……遍,这是为什么,这和fprintf的实现有关吗?
|
每个进程都有自己独立的缓存区,在子进程退出时自动把缓存中的内容写到文件中,而且每次写入的都是完整的文件内容(是对特定的进程来说的),所以才会出现这种情况。
|
fprintf只是写到磁盘缓冲里,并没有写磁盘文件.
在fprintf后面加一句fflush(fp);(fp是你的文件指针)就可以了,在getch时就有文件拉.
fprintf的确每fork一个进程才写一次,因为必须写满缓冲后再批量写磁盘的原因,你会感觉文件是批量生成的.
在fprintf后面加一句fflush(fp);(fp是你的文件指针)就可以了,在getch时就有文件拉.
fprintf的确每fork一个进程才写一次,因为必须写满缓冲后再批量写磁盘的原因,你会感觉文件是批量生成的.
|
我也觉得是缓冲没有输出的问题,因为fork以后,子进程有了和主进程一样的内存环境,也有同样的输出缓冲,也就是父/子进程的都有要输出的标志,例如在第一个进程执行时,父/子进程的输出缓冲中都有1,所以信息会写两遍,至于解决办法就像 95533(鼠标垫)说的那样