我运行这个编程。在前景和背景中:
int main()
{
int pid;
printf("App Start pid=%d!\n",getpid());
while(1) {
pid=fork();
if(pid==0) {
printf("Child\n\n");
exit(0);
}
else if(pid>0) {
printf("Parent\n");
}
sleep(1);
}
}
前景中的:
$ ./fork
结果是:
App Start pid=1360!
Parent
Child
Parent
Child
...
在后台:
$./fork > out.txt &
$cat out.txt
App Start pid=1368!
Child
App Start pid=1368!
Parent
Child
App Start pid=1368!
Parent
Parent
Child
...
为什么应用重启'在背景? 我不明白发生了什么。 如何让fork在后台应用程序中正常工作? 感谢
答案 0 :(得分:4)
这与输出缓冲区有关:新创建的进程正在遍历其父已print
编辑的内容。请注意,消息不会改变,即:它总是App Start pid=1368!
。
在第一次调用fflush(stdout)
后放置printf()
:
printf("App Start pid=%d!\n",getpid());
fflush(stdout);
这样输出缓冲区将在创建子进程之前刷新。
请注意,默认情况下,通过启动fork
程序而不重定向stdout
(即:$ ./fork
),stdout
行缓冲。因此,每次收到换行符时,都会执行stdout
的刷新。