15

子プロセスから整数値を返そうとしています。

ただし、使用すると、からの出力としてexit(1)取得されます。を使用すると が得られます。256wait()exit(-1)65280

子プロセスから送信した実際の int 値を取得する方法はありますか?

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
printf("%d",status);

編集: (これは私が実際に望んでいるものです) を使用exit(-1)すると、 の出力として 255 が得られWEXITSTATUS(status)ます。無印でいいのでしょうか?

4

5 に答える 5

25

「man waitpid」を試しましたか?

waitpid() 呼び出しから返される値は、終了値のエンコーディングです。元の終了値を提供する一連のマクロがあります。または、移植性を気にしない場合は、値を 8 ビット右シフトしてみてください。

コードのポータブル バージョンは次のようになります。

if(!(pid=fork()))
{
    exit(1);
}
waitpid(pid,&status,0);
if (WIFEXITED(status)) {
    printf("%d", WEXITSTATUS(status));
}
于 2010-09-07T14:37:02.147 に答える
13

終了コードは16ビット値です。

上位8ビットは。からの終了コードですexit()

プロセスが正常に終了した場合、またはプロセスを強制終了した信号番号をエンコードし、コアをダンプしたかどうかに関係なく、下位8ビットはゼロです(信号が送信された場合、上位ビットはゼロです)。

WIFEXITEDおよびWEXITSTATUSを使用して正しい値を取得する方法について<sys/wait.h>は、システムコールのヘッダーとドキュメントを確認してください。waitpid()

于 2010-09-07T14:39:25.300 に答える
4

ドキュメントを参照してください。最初に使用WIFEXITEDして、正常に終了したかどうかを判断します(おそらくゼロ以外のステータスで)。次に、を使用WEXITSTATUSして、実際のステータスの下位8ビットを判別します。

于 2010-09-07T14:39:18.800 に答える
2

WEXITSTATUS()子の正しい終了ステータスを読み取るために使用します

waitpid()またはによって返されたステータスを渡しますwait()

例えば:

int cstatus;
wait(&cstatus);
printf("Child exit status : %d\n", WEXITSTATUS(cstatus));
于 2015-04-10T19:58:05.063 に答える
0

そうではありません。それを 255 に設定します。使用できるビットは 8 ビットだけです。ドキュメントを参照してください。

于 2016-01-31T00:37:58.103 に答える