C言語関係掲示板

過去ログ

No.1046 子プロセスの終了値

[戻る] [ホームページ]
No.13512

子プロセスの終了値
投稿者---開発者C級(2004/04/06 14:20:36)


fork()で子プロセスを作り、exit(int型)で終了したときのことなのですが、
子プロセス側でexit直前に終了値を標準出力したものと、親プロセス側でwait後にWEXITSTATUSにより取得した子プロセス終了値を標準出力したものが食い違ってしまう現象が起こって困っています。
このような現象についてご存知の方がおられましたら、是非教えてください。

ちなみに
Linux環境(バージョンはわかりません)にて開発してます。

No.13513

Re:子プロセスの終了値
投稿者---tetrapod(2004/04/06 15:35:09)


WIFEXITED の値はどうなっていますか?
0なら WEXITSTATUS に意味はありません。

exit() に渡す終了コードの値は具体的にいくつですか?
Linux を含むほとんどの UN*X の実装において、
wait/waitpid/wait3 が返す終了コードは8ビットしかありません。
よって例えば子が exit(257) で終了すると親は 1 を受け取ります。

# ローカルオブジェクトのデストラクタが呼ばれないので
# exit() なんて怖くてよー使わん今日この頃。


No.13514

Re:子プロセスの終了値
投稿者---開発者C級(2004/04/06 16:18:11)


>WIFEXITED の値はどうなっていますか?
>0なら WEXITSTATUS に意味はありません。
>
>exit() に渡す終了コードの値は具体的にいくつですか?
>Linux を含むほとんどの UN*X の実装において、
>wait/waitpid/wait3 が返す終了コードは8ビットしかありません。
>よって例えば子が exit(257) で終了すると親は 1 を受け取ります。
>
># ローカルオブジェクトのデストラクタが呼ばれないので
># exit() なんて怖くてよー使わん今日この頃。

早いお返事ありがとうございます。
子プロセスがexit()に渡す値は1で、親がWEXITSTATUSで取得する値が0なのです。ですから8ビットの制限には関係ないのかと思うのです。WIFEXITEDの値にも問題ないはずです。(子プロセスで終了値を標準出力させているのはexit()の直前ですので、子プロセスはほぼ間違いなくexit終了していると考えられます。)


No.13515

Re:子プロセスの終了値
投稿者---かずま(2004/04/06 16:50:53)


> 子プロセスがexit()に渡す値は1で、親がWEXITSTATUSで取得する値が0なのです。
> ですから8ビットの制限には関係ないのかと思うのです。WIFEXITEDの値にも
> 問題ないはずです。(子プロセスで終了値を標準出力させているのはexit()の
> 直前ですので、子プロセスはほぼ間違いなくexit終了していると考えられます。)

言葉でいくら説明しても、プログラムがそうなっていなければ、思ったとおりの
結果が出ないのは当然のことです。プログラムを掲載してください。私が試した
限りでは、そんな変な現象は出ません。
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
    int status;
    pid_t pid = fork();
    if (pid == 0) {
        status = 1;
        printf("child: status=%d\n", status);
        exit(status);
    }
    printf("parent: pid=%d\n", pid);
    pid = wait(&status);
    printf("pid=%d, status=%#x, WEXITSTATUS(status)=%d\n",
        pid, status, WEXITSTATUS(status));
    return 0;
}


No.13519

Re:子プロセスの終了値
投稿者---開発者C級(2004/04/07 02:13:51)


遅くなりましてごめんなさい。

実はとくにソースを変えたわけでもないのに、例のおかしな現象は発生しなくなってしまったんです。
それと近場のものからの情報で、Linux環境で領域侵犯を起こすとint型変数の値に影響があるらしいとのことでした。

以上をまとめますと、fork()を実際にコーディングしてあるソースファイルとは別の関連モジュールにおいて領域侵犯だったものが更新され、その所為で子プロセスの終了値がおかしくなる現象が起こらなくなったのだろう、というように考えられます。

これからテストを重ね、もし上記とは異なる真実を見つけた場合はご報告させていただきます。この件に関してお付き合いくださいました方々、本当にありがとうございました。