下面的程序如何工作并在linux下创建一个Zombie进程?
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
sleep (60);
}
else {
exit (0);
}
return 0;
}
答案 0 :(得分:8)
它创建子节点并且不等待(使用wait *系统调用之一)。僵尸就是这样:父母还没有等待的孩子,内核必须为他们维护一些信息 - 主要是退出状态 - 以便能够将其返回给父母。
答案 1 :(得分:1)
缺少setsid()
命令。
每个* nix进程都会产生一个必须获得的退出状态。如果应该首先终止子进程,则应该使用wait()语句由父进程获取。
当父进程在子进程之前终止时,setsid()
命令将父进程切换为init。
Root应该能够使用kill -9从进程列表中删除僵尸。没有经验的程序员有时会省略setsid()
,这会隐藏产生错误的错误,否则会阻塞磁盘驱动器。
在旧的日子里,系统管理员会使用僵尸来识别需要额外培训以产生良好代码的缺乏经验的程序员。
当内核过早终止程序时,init收集的退出状态将发送到syslog。该退出状态用于识别导致提前终止的错误的性质(错误条件不由程序员处理)。
以这种方式报告的退出状态成为syslog或klog文件的一部分,这些文件通常用于调试代码。