1

posix_spawnp を使用してさまざまなプロセスを実行し、(waitpid を使用して) ステータスをチェックして、子が適切に作成されたことを確認します。

    int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);       

    if (iRet != 0)
    {
        return false;
    }

    int iState;
    waitpid(static_cast<pid_t>(iPID), &iState, WNOHANG);
    cout << "Wait: PID " << iPID << " | State " << iState << endl;

    if (WIFEXITED(iState)) {
        printf("Child exited with RC=%d\n",WEXITSTATUS(iState));
    }
    else if (WIFSIGNALED(iState)) {
        printf("Child exited via signal %d\n",WTERMSIG(iState));
    }
    else
    {
        printf("Child is NORMAL");
    }

最初はこれが適切に実行され、次のメッセージが表示されます。

待機: PID 15911 | 状態 0 子は RC=0 で終了しました

同じプロセスを数回実行した後、子プロセスはステータス 127 で終了し始めます。

待機: PID 15947 | 状態 32512 子が RC=127 で終了しました

これが起こった後、私は子供を再び産卵させることができませんでした。上記のコードのセクションを for ループで囲みましたが、適切に生成されません。親プロセスを再起動すると、しばらくは機能しますが、しばらくすると同じ問題が再び発生します。

ここで何が間違っていますか?

4

2 に答える 2

1

このリンクを確認してください。

例えば:

EINVAL file_actions または attrp で指定された値が無効です。

posix_spawn および posix_spawnp サブルーチンのエラー コードは、次の条件の影響を受けます: 呼び出しプロセスが posix_spawn または posix_spawnp 関数から正常に戻った後にこのエラーが発生した場合、子プロセスは終了ステータス 127 で終了する可能性があります。

さまざまな理由で 127 で終了するように見えます。

于 2009-04-17T12:28:52.063 に答える
0

からのリターン コードをチェックして、waitpid()問題がないことを確認します。

waitpid()コードの読み取り方は、一度に 1 つの子プロセスのみを生成していることを示唆しています (そうでなければ、ループ内で呼び出す必要はありません)。ただし、その場合、使用することは期待できませんWNOHANG

于 2009-04-17T07:53:52.100 に答える