使用 kill 函数创建僵尸进程
Creating A Zombie Process Using the kill Function
我正在尝试使用 kill
函数创建僵尸进程,但它只会杀死子进程并 returns 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();
}
}
关键是 parent —— 即这个程序 —— 保持 运行 但 而不是 在 wait()
垂死 child.
丧尸已死child人未等。如果这个程序等待它死掉 child,它就会消失而不是僵尸。如果这个程序退出,僵尸 child 将被其他人继承(可能是 init
),这可能会等待,并且 child 会消失而不是僵尸。
据我所知,僵尸的全部原因是死者 child 以退出状态退出,这可能是某些人想要的。但是 Unix 存储退出状态的地方是 dead 进程的空壳,而你如何获取 dead child 的退出状态是通过等待它。所以 Unix 保留僵尸只是为了保持它的退出状态,以防万一 parent 想要它但还没有开始调用 wait
。
所以这实际上有点诗意:这里的 Unix 哲学基本上是没有 child 的死亡不应该被忽视。
我正在尝试使用 kill
函数创建僵尸进程,但它只会杀死子进程并 returns 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();
}
}
关键是 parent —— 即这个程序 —— 保持 运行 但 而不是 在 wait()
垂死 child.
丧尸已死child人未等。如果这个程序等待它死掉 child,它就会消失而不是僵尸。如果这个程序退出,僵尸 child 将被其他人继承(可能是 init
),这可能会等待,并且 child 会消失而不是僵尸。
据我所知,僵尸的全部原因是死者 child 以退出状态退出,这可能是某些人想要的。但是 Unix 存储退出状态的地方是 dead 进程的空壳,而你如何获取 dead child 的退出状态是通过等待它。所以 Unix 保留僵尸只是为了保持它的退出状态,以防万一 parent 想要它但还没有开始调用 wait
。
所以这实际上有点诗意:这里的 Unix 哲学基本上是没有 child 的死亡不应该被忽视。