从子进程中检索 PID 和退出状态

Posted

技术标签:

【中文标题】从子进程中检索 PID 和退出状态【英文标题】:Retrieving PID and Exit Status from child process 【发布时间】:2015-10-13 02:37:40 【问题描述】:

在我的任务中,我要输入“n”个并创建“n”个子进程。从那里,子进程 execl 进入另一个程序,该程序让它们休眠随机数秒(0 到 9 之间),然后以随机数的退出状态退出。一旦他们退出,在父母中,我将打印孩子的 PID 和孩子的退出状态。我的问题是我不确定如何在不使用 IPC 的情况下获取 PID 或退出状态。伴随着“孩子死了……”出来的同时。这就是我现在想出的。

父母:

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

int main()

      char input[12];
      int n, i, ch;
      pid_t pid;
      int status;

      printf("Enter an integer: ");
      fgets(input, 12, stdin);
      if (input[10] == '\n' && input[11] == '\0')  while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); 
      rmnewline(input);

      n = atoi(input);

      for(i=0; i<=n-1; i++)
      
          pid = fork();
          if(pid == 0)
            execl("/home/andrew/USP_ASG2/sleep", "sleep", NULL);
      

      while(wait(NULL)>0)
      
         if(WIFEXITED(status))
         
             int exitstat = WEXITSTATUS(status);
             printf("Child %d is dead with exit status %d\n", pid, exitstat);
         
      
 

孩子:

int main()

    srand(time(NULL));
    int r = rand() % 10;

    printf("In child %d\n", getpid());
    sleep(r);

    exit(r);

当前输出: 我注意到的几件事是“孩子死了……”输出都同时返回。当他们肯定不同时。

xxxxxx@ubuntu:~/USP_ASG2$ ./q2
Enter an integer: 3
In child 15624
In child 15623
In child 15622
Child 15624 is dead with exit status 0
Child 15624 is dead with exit status 0
Child 15624 is dead with exit status 0

【问题讨论】:

status 未初始化。您需要将指向它的指针传递给wait 1) 阅读wait 的手册页。 2) 利润。 建议使用 waitpid(),这样您就可以知道哪个孩子退出了。 发布的代码可能应该对变量 'n' 执行一些范围检查,以确保它是一个合理的正值 函数:execl()失败时代码需要处理错误情况。代码需要处理fork()失败时的错误情况 【参考方案1】:

建议使用 waitpid() 以便您知道哪个孩子退出了。

fork() 函数将子进程的 pid 返回给父进程(阅读 fork() 的手册页)

要获取/使用子节点的退出状态,wait()waitpid() 有一个参数,它是一个指向 int 变量的指针。

wait()waitpid() 返回其调用者时,int 变量将包含子进程的退出状态。

【讨论】:

以上是关于从子进程中检索 PID 和退出状态的主要内容,如果未能解决你的问题,请参考以下文章

僵尸进程

如果父进程仍在运行,子进程的 PID 是不是可供重用?

分叉后退出子进程

我们应该在子进程中使用退出还是返回

僵尸进程

1.9 进程pid,运行耗时 运行退出状态