13

私のプログラムでは、有限の while ループで子プロセスを (並行して) fork し、それぞれに対して exec を実行しています。すべての子が終了した後にのみ、親プロセスが実行を再開するようにします (この while loop の後のポイント)。どうすればいいですか?

私はいくつかのアプローチを試しました。1 つのアプローチでは、while ループの後に親を一時停止し、waitpid がエラー ECHILD (残りの子がありません) を返したときにのみ SIGCHLD ハンドラーから条件を送信しましたが、このアプローチで直面している問題は、親がすべてのプロセスのフォークを完了する前であっても、retStat は次のようになります。 -1

    void sigchld_handler(int signo) {
        pid_t pid;
        while((pid= waitpid(-1,NULL,WNOHANG)) > 0);
        if(errno == ECHILD) {
            retStat = -1;
        }
    }

    **//parent process code**
    retStat = 1;
    while(some condition) {
       do fork(and exec);
    }

    while(retStat > 0)
        pause();
//This is the point where I want execution to resumed only when all children have finished
4

2 に答える 2

21

シグナル ハンドラを呼び出す代わりにwaitpid、次のようにすべてのプロセスを fork した後にループを作成してみませんか。

while (pid = waitpid(-1, NULL, 0)) {
   if (errno == ECHILD) {
      break;
   }
}

子がなくなるまで、プログラムはループで停止する必要があります。その後、脱落し、プログラムが続行されます。追加のボーナスとして、waitpid子が実行されている間はループがブロックされるため、待機中にビジー ループは必要ありません。

wait(NULL)と同等の which を使用することもできますwaitpid(-1, NULL, 0)。SIGCHLD で他に何もする必要がない場合は、SIG_IGN に設定できます。

于 2009-10-02T17:49:20.680 に答える
0

waitpid()通話を使うべきだと思います。「任意の子プロセス」を待つことができるので、それを適切な回数行うと、ゴールデンになるはずです。

それが失敗した場合 (保証について不明な場合)、ループ内に座ってブルート フォース アプローチを実行し、waitpid()各子NOHANGPID でオプションを実行してから、もう一度実行する前にしばらく遅らせることができます。

于 2009-10-02T17:46:48.897 に答える