请在c:
中考虑此代码 int main()
{
pid_t cpid;
cpid = fork();
if (cpid == -1)
{
perror("fork");
return 0;
}
if (cpid == 0)
{
printf("I'm child\n");
_exit(0);
}
else
{
while(1)
{
printf("I'm parent\n");
sleep(1);
}
}
return 0;
}
运行代码后,我希望它能够运行child并在完成后退出。 但是当我跑步时
pgrep executable_name
或
ps fax
它显示了子进程ID,我不知道它只是一个工作进程的历史废话,还是它真的没有结束/终止子进程?
提前致谢
答案 0 :(得分:5)
孩子将一直待到父母去世或父母用wait
系统调用清理它。 (在孩子终止和被清理之间的时间里,它被称为僵尸过程。)
原因是父级可能对子级的返回值或最终输出感兴趣,因此进程条目保持活动状态,直到查询该信息为止。
编辑:
使用sigchld处理程序在没有阻塞的情况下立即清理进程的示例代码:
请注意系统调用(如睡眠,选择或文件读/写)可能会被信号中断。这是你应该在unix中处理的正常事情 - 它们失败并将errno设置为EINTR。发生这种情况时,您可以再次尝试完成操作。这就是为什么我的示例代码在父级中调用两次睡眠 - 第一次长睡眠因孩子死亡而中断,然后第二次更短的睡眠让我们确认在父级死亡之前实际清理了该过程。
BTW信号处理程序通常不应该做太多,它们应该尽快返回并避免非线程安全的事情;通常不鼓励打印它们。我这样做只是为了让你可以随时观看所有事情。答案 1 :(得分:2)
您需要在父级中调用wait()
,否则永远不会获得子进程(它变为僵尸)。 *
<小时/> *除非父母本身也退出。