3

SIGCHLDハンドラー関数で次の問題が発生しました。

ハンドラーコードは非常に単純です。

void sigchld_handler(int signum)
{
    pid_t ended;    
    signal(SIGCHLD, sigchld_handler);
    ended = wait(NULL);
    // do some stuff with the PID of the finished child process
}

これは、子供を1人だけフォークする場合にうまく機能します。2つ(またはそれ以上)の子があり、そのうちの1つが実行を終了すると、sigchld_handler()が開始し、「ended = wait(NULL)」行に到達すると、プログラムはもう1つの子が終了するまで待機します。

別の方法で終了したばかりの子のPIDを取得し、この待機を回避する方法はありますか?

4

1 に答える 1

3

代わりにsigaction()を使用してください。ハンドラーには、次の署名があります。

void (*sa_sigaction)(int, siginfo_t *, void *);

struct siginfo_tそして、manページから必要な情報が渡されます。

SIGCHLDは、si_pid、si_uid、si_status、si_utime、およびsi_stimeを入力して、子に関する情報を提供します。 si_pidフィールドは、子のプロセスIDです。

注:をwait()使用しない限り、もちろん子プロセスを実行する必要がありますSA_NOCLDWAIT

于 2012-12-01T15:02:19.267 に答える