在后台拨叉不工作正确
问题描述:
我运行这个编。在前景和背景:在后台拨叉不工作正确
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
...
为什么应用程序 '重启' 在背景? 我不明白发生了什么事。 我如何让叉子在后台应用程序中正常工作? 感谢
答
这同输出缓冲器做:新创建的进程正在写一遍又一遍什么他们的父母已经print
版。请注意,该消息不会更改,即:始终为App Start pid=1368!
。
广场fflush(stdout)
第一次调用printf()
后:
printf("App Start pid=%d!\n",getpid());
fflush(stdout);
这样输出缓冲区将是创建子进程之前冲刷。
注意,通过启动fork
程序而不重定向stdout
(即:$ ./fork
),stdout
是行缓冲默认。因此,每当它收到换行符时,已执行冲洗stdout
。
缓冲标准输出的另一个好的答案:stackoverflow.com/a/39536803/646887 –