使用kill函数创建Zombie进程
作者:互联网
我正在尝试使用kill函数创建一个僵尸进程,但它只是杀死了孩子并返回0.
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
kill(getpid(),SIGKILL);
}
else {
exit (0);
}
return 0;
}
当我检查进程的状态时,状态列中没有z.
解决方法:
这是一个简单的食谱,应该创建一个僵尸:
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int main()
{
int pid = fork();
if(pid == 0) {
/* child */
while(1) pause();
} else {
/* parent */
sleep(1);
kill(pid, SIGKILL);
printf("pid %d should be a zombie\n", pid);
while(1) pause();
}
}
关键是父母 – 即这个程序 – 继续运行但不会对垂死的孩子进行等待().
僵尸是没有等待的死孩子.如果这个程序等待它死去的孩子,它就会消失而不是僵尸.如果这个程序退出,僵尸孩子将被其他人(可能是init)继承,这可能会等待,孩子会离开而不是僵尸.
据我所知,僵尸的全部原因是死亡的孩子退出了退出状态,有人可能会想要.但是,在Unix存储退出状态的地方是死亡进程的空壳,以及如何获取死亡孩子的退出状态是等待它.所以Unix正在保持僵尸只是为了保持其退出状态,以防父母想要它但尚未调用等待.
所以它实际上有点诗意:Unix的哲学基本上就是不应该忽视孩子的死亡.
标签:c-3,linux,process,zombie-process 来源: https://codeday.me/bug/20190628/1311639.html