系统相关
首页 > 系统相关> > 创建僵尸进程

创建僵尸进程

作者:互联网

我有兴趣创建一个僵尸进程.根据我的理解,当父进程在子进程之前退出时,就会发生僵尸进程.但是,我尝试使用以下代码重新创建僵尸进程:

#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