【问题标题】:I am trying to create a zombie process [duplicate]我正在尝试创建一个僵尸进程[重复]
【发布时间】:2018-08-12 17:08:42
【问题描述】:

我正在尝试通过了解在线解决方案来创建一个僵尸进程

但我仍然无法使用以下代码找到任何僵尸进程

我不知道我的代码出了什么问题

我正在尝试pstree -ptop 命令来查找我的僵尸进程 但我找不到任何

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, char const *argv[])
{
    pid_t childPID;

    childPID = fork();

    if(childPID < 0)
    {
        printf("child Process creation failed\n");
    }
    else if(childPID == 0)
    {

        printf("I am child Process.My pid is: %d\n", getpid());

        exit(0);

        sleep(100);
    }
    else
    {
        sleep(10);


        printf("I am parent process.my pid: %d\n", getpid());
        printf("My child process is: %d\n",childPID);
    }

    return 0;
}

【问题讨论】:

  • 'sleep(100);'的目的是什么行吗?
  • 理论上,我知道,子进程会在 exit(0) 指令后退出。
  • 僵尸进程是一个已经退出的进程(所以它不再运行;它已经死了)但僵尸的父进程还没有执行收集僵尸进程的wait()waitpid()退出状态信息(因此仍然需要它的进程槽;它是部分活着的——因此是“僵尸”)。
  • 您的sleep(100); 是死代码;它永远不会被执行。你的sleep(10); 不是最好的地方。您只在睡眠后(10 秒)和父进程退出之前告诉世界其他进程哪个进程是僵尸。当父进程退出时,系统会清理僵尸子进程。打印后移动sleep(10);。然后考虑用pause(); 替换它,它无限期地不做任何事情,直到进程发出信号(通常被中断)。这让你有足够的时间去吃午饭,在父母死前追逐僵尸。
  • 您为什么希望top 报告死进程?至少,僵尸没有使用任何 CPU 时间,所以它们会在top 的任何列表的最底部。是的,您可以使用while (1) ; 而不是pause(),但是使用pause() 可以阻止进程占用CPU 的所有资源,并让系统继续进行有用的工作。当然,这也意味着它会下拉top中的活动进程列表;这在我的书中是可以的,因为除了让孩子看起来像僵尸之外,它没有做任何有用的事情。

标签: c linux operating-system fork zombie-process


【解决方案1】:

我可以在父进程仍在运行时看到僵尸进程

但是当父进程死亡时,两个进程都会消失。我的猜测是,一旦父进程死亡,init(或任何以 pid 1 运行的进程)waitpids 将用于僵尸,从而将其从进程列表中删除。

另见Create zombie process

【讨论】:

  • 哦,这意味着我需要有父进程才能继续运行才能看到僵尸进程
  • @ImranHossain 是的
  • @ImranHossain 否则,你怎么能摆脱僵尸进程?
  • 但对我来说只是父进程显示
  • 我只是不能给你发评论的照片
猜你喜欢
  • 2021-12-09
  • 2014-09-30
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多