5

これは、親が子を殺すように通知されたときに、リーパー関数に追加のパラメーターを絞り込む方法 (c)のフォローアップです。

私の reaper() では、親が終了しようとしている子の pid を取得しようとします (ここでは残酷な言葉ではありません)。しかし、wait() は子の pid を返しません。代わりに、1 を返します。戻り値 1 のドキュメントがどこにも見つかりません。何か頭がありますか?

void    reaper(int sig)
{
    int status, killedpid;

    while(killedpid = (/*waitpid(-1, &status, WNOHANG)*/wait(&status)) >= 0)
    {
        printf("reaper %d killed %d\n", getpid(), killedpid);
    }
}

私の結果:

reaper 5933 killed 1 //actual child pid is 5936

前もって感謝します!

4

1 に答える 1

15

これは、条件付きエラーの古典的な割り当てです。式は次のように評価されます(比較は割り当てよりも優先されるため)。

if ( killedpid = ( wait( &status ) >= 0 )) { ...

はC言語のTRUEのkilledpid値を取得します1。これを回避するには、括弧を使用して、次のような高い警告レベルでコンパイルします-Wall -pedantic

if (( killedpid = wait( ... )) >= 0 ) { ...
于 2010-12-11T04:27:27.817 に答える