在这种情况下,我写了一个简单的编程:
int main()
{
pid_t chpid;
chpid=fork();
if(chpid==0) // child
{
sleep(2);
execlp("/usr/bin/man","/usr/bin/man","ps",NULL);
printf("still alive\n");
}
else
{
printf("parent goes down\n");
}
return 0;
}
在运行父母死亡时在2秒内我得到:/usr/bin/man: command exited with status 1: pager -s
为什么这样运行?肯定问题是父母的死,如果我在父母的代码中添加while(1)一切都很好。
我写了一个test-prog,它会在每个时间段内将一些字符串写入标准输出。有用。看起来很奇怪。
答案 0 :(得分:1)
当孩子正在跑步时从父母那里退出,你刚刚守护了孩子。守护进程及其分支没有控制终端,这是寻呼机运行的要求(我相信pager -s
是less(1)
,但检查它:man pager
)。
另一方面,即使对于一个守护进程,写STDOUT也不是犯罪,尽管不能保证有人会在那里读取输出。
有关更好的解释,请参阅Richard Stevens关于流程组,会话和控制终端的“Advanced Programming in the UNIX Environment”。
答案 1 :(得分:0)
使用wait(3p)
等待孩子死亡。
答案 2 :(得分:0)
因此。一个小小的研究表明,shell已经启动了我的进程,它通过setpgid()
设置控制终端(我的proc)。当它死亡时,shell会再次调用setpgid()
,尽管我的proc已经fork
所有的孩子。所以他们已经是守护进程了。正如我所发现的,守护进程也可以做一些输出例程,但它们并不一定能成功。可能是,可能不是。这就是为什么孩子在父母去世后仍可以输出的原因(例如,如果我分叉一个简单的piriodical writong hello world程序)。而且男人明白,他的产出会随之而来,并开始恐慌。这就是我看到它的方式。
至于strace
,它很简单:在我的程序的所有生命周期中,strace仍然存在,所以输出没有问题。