0

posix_spawnp を使用して、メイン プロセスから子プロセスを生成します。

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

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

子プロセスがエラーなしで生成された後、突然機能しなくなることがあります。これはどのように発生する可能性がありますか?

シグナル ハンドラーを使用して、子プロセスを取得します。

void SigCatcher(int n)
{       
    while(waitpid( -1, NULL, WNOHANG ) > 0);        
}

子プロセスを強制終了するたびに手動で呼び出します。

    kill(oProcID, SIGKILL);

    signal (SIGCHLD, SigCatcher);

これにより、生成された子供が機能しなくなる可能性がありますか (私が kill を呼び出さずに)。

4

2 に答える 2

3

これ:

kill(oProcID, SIGKILL);

signal (SIGCHLD, SigCatcher);

競合状態のように見えます。子プロセスを強制終了する前にシグナル ハンドラーをインストールする必要があります。そうしないと、シグナルを見逃す危険があります。

于 2009-04-16T09:38:44.527 に答える
1

電話しましたか:

signal(SIGCHLD, SigCatcher);

どこか他の?

そうでない場合は、子プロセスが生成される前に、それらの子プロセスが終了したときに確実に取得されるようにする必要があります。

Unwind が指摘しているように、現在のkillandへの呼び出しsignalは間違っています。

典型的な使用法は次のとおりです。

signal(SIGCHLD, handler);
posix_spawnp(...);
...
// do other stuff
...
kill(pid, SIGKILL);
于 2009-04-16T09:44:43.123 に答える