0

4つの並列処理で何かしたい

最初にonecをフォークし、子と親で再びフォークして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

pid=-1でwaitpid()を使用しています。子プロセスが終了するのを待ちます。つまり、子プロセスのいずれかが終了するとすぐに、親プロセスのwaitpid()が終了します。他の子プロセスが完了するまで待機しません。

于 2013-11-05T06:02:34.853 に答える
0

シナリオを処理するより良い方法は、メイン プロセスに "SIGCHLD" のシグナル ハンドラーを配置し、wait/waitpid を使用して子終了ケースを取得することです。このような場合、SIGCLD がメイン プロセスに配信されるため、すべての子の死亡を監視/通知できます。

于 2013-11-05T09:15:44.787 に答える