首页 > 解决方案 > 更好地识别孩子

问题描述

我试图创建一个僵尸进程,使用ps命令进行验证。虽然解决方案很好,但对于将孩子识别为僵尸来说并不是很有启发性。任何人都可以帮助我进行一些改进吗?

这是我的代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   int pid=fork();
   if (pid>0)
   {
       printf("in parent process");
       sleep(30);
       execlp("ps","ps",NULL);
   }
   else if (pid==0) 
   {
       printf("in child process");
   }
   return 0;
}

标签: clinuxprocesschild-processzombie-process

解决方案


僵尸进程不代表任何东西,只是它的父进程尚未wait(2)编辑的死进程。它的存在只是为内核提供一种将其记帐详细信息(例如花费的 cpu 时间或退出代码)传递回其父进程的方法,以使wait(2)系统调用可靠。

没有别的了,根据操作系统的不同,您甚至无法获取用于调用它的命令行参数,或者它所代表的进程的名称。

对于僵尸进程,您唯一能做的就是让其父进程为它做事wait(2),因此,将会计详细信息、退出代码和其他信息传递给它的父进程。没有分配内存,没有专用或锁定的系统资源,它的所有文件描述符都已关闭,只有它的 pid、进程组 ID、会话 ID 以及累积的系统和用户空间 cpu 时间(对于它,以及其子进程的累加)存储在进程表中,因此wait(2)系统调用也可以在父进程exit(2)s或wait(2)s为它时对其进行累加。

正如您可能已经检测到的那样,您不能kill(2)成为僵尸进程(好吧,您确实可以是kill(2)它的父进程,因此它将永远安息——和父进程),因为它已经死了。

为了更好地识别进程,您必须在父进程中收集该信息(父进程在wait(2)系统调用系列中接收所有信息)您将获得pid_t进程 ID,因此您将知道哪个您的子进程是您的子进程wait(2)。当你(父母)创建它时,你会知道你需要了解你的孩子的一切(你在fork(2)创建它时从系统调用中获得了这个 pid)


推荐阅读