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

时间:2015-10-13 02:37:40

标签: c parent-child ipc pid exit-code

在我的任务中,我输入'n'并创建'n'个子进程。从那里,子进程执行到另一个程序,让它们以随机秒数(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

1 个答案:

答案 0 :(得分:0)

建议使用waitpid(),这样你就会知道哪个孩子退出了。

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

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

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