【发布时间】:2018-08-12 17:08:42
【问题描述】:
我正在尝试通过了解在线解决方案来创建一个僵尸进程
但我仍然无法使用以下代码找到任何僵尸进程
我不知道我的代码出了什么问题
我正在尝试pstree -p 和top 命令来查找我的僵尸进程
但我找不到任何
#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