【问题标题】:better identification of the child更好地识别孩子
【发布时间】:2020-05-02 17:17:18
【问题描述】:

我尝试创建一个僵尸进程,使用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;
}

【问题讨论】:

  • 为我工作。我在a.out 之后看到&lt;defunct&gt;。顺便说一句,sleep(30) 太过分了。只需sleep(1) 就足够了。 (你甚至可以用waitpid(pid, NULL, WNOWAIT); 完全替换sleep,它仍然可以工作。)
  • 您希望一个足够好的解决方案更具启发性?这不是某种主观的说话方式吗?你想要一些东西还是只是一些东西? Zombie 进程是一个死进程……在系统中没有为它分配资源,而只是一个进程表的条目。

标签: c linux process child-process zombie-process


【解决方案1】:

僵尸进程不代表任何东西,只是它的父进程尚未wait(2)ed 的死进程。它的存在只是为内核提供一种将其记帐详细信息(如所花费的 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)ed 的子进程。当你(父母)创建它时,你会知道你需要了解你的孩子的一切(你在创建它时从 fork(2) 系统调用中获得了这个 pid)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多