2009-04-16 2 views
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と呼ぶことなく)ことができますか?

答えて

2

この:

kill(oProcID, SIGKILL); 

signal (SIGCHLD, SigCatcher); 

race conditionのように見えます。子プロセスを強制終了する前にシグナルハンドラをインストールする必要があります。そうしないとシグナルが失われる危険性があります。

+0

感謝。私はシグナルハンドラを共有ライブラリに実装しました。コンストラクタに "signal(SIGCHLD、SigCatcher)"を置くと登録されません。これはメイン()に入っていなければなりませんか? – Gayan

+0

@ Gayan:おそらく、アプリケーションがメインで最初に行うことの1つとしてシグナルハンドラを設定するだけです。 –

+0

コンストラクタ内にあるということは重要ではありません。とにかくメインになるはずです(私の答えを参照してください) – Alnitak

1

は、あなたが求めている:どこか他の

signal(SIGCHLD, SigCatcher); 

を?

もしそうでなければ、子プロセスが生成される前にそれらを実行して、それらの子プロセスが終了時に確実に収穫されるようにする必要があります。

Unwindが指摘しているように、killsignalへの現在の通話は間違っています。

典型的な使用は、次のようになります。

signal(SIGCHLD, handler); 
posix_spawnp(...); 
... 
// do other stuff 
... 
kill(pid, SIGKILL); 
関連する問題