0

我想用四个并行进程做一些事情

我首先 fork onec,然后在 child 和 parent fork 中再次获得 4 个进程。

我想要的是在所有 4 个过程完成后做一些事情,所以我使用waitpid(-1, &status, 0);

我理想的输出是

in

numbers

out

但实际输出有时可能是

in

numbers

out

one number

我想不通。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <error.h>

int main()
{
    pid_t cpid, w;
    int status;

    printf("%s\n", "in");
      cpid = fork();
      if (cpid == 0)
      {
          cpid = fork();
          if (cpid == 0)
          {
            printf("%s\n", "1");
            exit(EXIT_SUCCESS);
          }
          else{
            printf("%s\n", "2");
            exit(EXIT_SUCCESS);
          }
      }
      else{
          cpid = fork();
          if (cpid == 0)
          {
            printf("%s\n", "3");
            exit(EXIT_SUCCESS);
          }
          else{
              printf("%s\n", "4");
              //exit(EXIT_SUCCESS);
          }      
      }
      waitpid(-1, &status, 0); 
      printf("%s\n", "out");
      //do something
      exit(EXIT_SUCCESS);
    return 0 ;
}
4

2 回答 2

2

您正在使用waitpid()pid=-1。它等待任何子进程完成。这意味着,只要任何一个子进程完成,父进程的waitpid()就会退出。它不会等待任何其他子进程完成。

于 2013-11-05T06:02:34.853 回答
0

处理场景的更好方法是在主进程中为“SIGCHLD”设置信号处理程序,并使用 wait/waitpid 来获取子退出案例。在这种情况下,可以监视/通知您所有孩子的死亡,因为 SIGCLD 将传递到主进程。

于 2013-11-05T09:15:44.787 回答