0

終了した子プロセスをチェックし、終了した場合はそれらを再起動するプログラムを作成しようとしています。他のプロセスが終了するのを待たずに、プロセスが終了するときにプロセスを再起動する必要があります。私は少し迷っています。これが私がこれまでに行ったコードです。本当に、それは終わっていないか、正しくありません。しかし、おそらく誰かが私を正しい方向に向けることができますか?

for(int ifile = 1; ifile < 4; ifile++){

    child_pid[ifile - 1] = vfork();

    if(child_pid[ifile - 1] == -1){
        cerr << "fork error on " << argv[ifile] << endl;
    }
    else if(child_pid[ifile - 1] == 0){
        execl(argv[ifile], argv[ifile], NULL);
    }
}

for(int index = 0; index < 3; index++){
    do{
        wait_pid = waitpid(child_pid[index], &status, WUNTRACED);
        if(WIFEXITED(status)){
            count++;
            child_pid[index] = vfork();
            if(child_pid[index] == -1){
                cerr << "rescheduled process error" << endl;
                return -1;
            }
            else if(child_pid[index] == 0){
                cout << "Rescheduling " << argv[index + 1] << endl;
                execl(argv[index + 1], argv[index + 1], NULL);
            }
        }
    }while(count != 4);
}
4

2 に答える 2

3

あなたのアプローチの問題は、その1番目の[0番目]の子が死ぬまでwaitpidでブロックし、その間に他の子が死ぬ可能性があることです。

あなたはできる:

(1)waitpid()の代わりにwait()を使用します。これにより、すべての子が処理されますが、ブロックされます。

(2)ループしながらwaitpid()とWNOHANGフラグを使用して死んだ子供をポーリングします。

(3)シグナルハンドラーを設定し、SIGCHILDシグナルをキャッチします。waitpid / WNOHANGループをハンドラーに入れますが、ハンドラーの外で再起動する作業を行います。

EGハンドラーは次のようなことを行います。

   while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) 
   {
        //set a flag or whatever; not wise to fork/exec in handler
   }
于 2011-05-08T02:28:45.073 に答える
2

なぜWUNTRACEDオプションが必要なのかわかりません。「停止」と表示されている場合は、終了ではなく一時停止と同じ意味であると確信しています。

2つの可能なアプローチ:

ループするのではなく、次のようにします。

pid_t pid = wait();

プロセスが終了するまでブロックされます。

または、3番目の引数をwaitpid()からWUNTRACEDに変更しWNOHANGます。これにより、ブロックせずに各プロセスをテストできます。その場合、ループを通過する各パスの最後に小さなスリープを追加することをお勧めします。

于 2011-05-08T02:23:52.610 に答える