创建僵尸进程
作者:互联网
我有兴趣创建一个僵尸进程.根据我的理解,当父进程在子进程之前退出时,就会发生僵尸进程.但是,我尝试使用以下代码重新创建僵尸进程:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
exit(0);
}
else {
sleep(100);
exit (0);
}
return 0;
}
但是,此代码在执行后立即退出,这是预期的.但是,就像我一样
ps aux | grep a.out
我发现a.out只是作为一个正常的进程运行,而不是像我预期的那样的僵尸进程.
我使用的操作系统是ubuntu 14.04 64位
解决方法:
引用:
To my understanding, zombie process happens when the parent process exits before the children process.
这是错的.根据man 2 wait
(见注释):
A child that terminates, but has not been waited for becomes a “zombie”.
所以,如果你想创建一个僵尸进程,在fork(2)之后,子进程应该退出(),并且父进程应该在退出之前sleep(),让你有时间观察ps的输出(1) ).
例如,您可以使用下面的代码而不是您的代码,并在sleep()时使用ps(1):
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* Child */
if (pid == 0)
exit(0);
/* Parent
* Gives you time to observe the zombie using ps(1) ... */
sleep(100);
/* ... and after that, parent wait(2)s its child's
* exit status, and prints a relevant message. */
pid = wait(&status);
if (WIFEXITED(status))
fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
(int) getpid(), pid, WEXITSTATUS(status));
return 0;
}
标签:c-3,linux,operating-system,fork,zombie-process 来源: https://codeday.me/bug/20191007/1867153.html