2011-11-10 17 views
10

私は整数値を返すCプログラムを持っています。私は全体の整数が表示されないのはなぜLinux/bashのプログラム戻り値の有効範囲は何ですか?

> ./prog.e 
> echo $? 
1 
  • - 私は、シェルプロンプトからの戻り値を調べるとき、私は値モジュロ256

    /* prog.c */ 
    int main(...) { return 257; } 
    

    を得ることを見つけるために驚きました?

  • この動作は文書化されていますか?
  • シェルに32ビット値全体を取得するにはどうすればよいですか?プログラムが終了すると、それが終了ステータスを使用して、親プロセスに終了の原因に関する情報の少量を返すことができ
+3

戻り値は定義上のエラーコードです。戻り値を使用して他の数値と通信することはできません。成功(0)またはエラー(非ゼロ)を示すために必ず使用されます。 *成功*実行中に何らかの種類のカウントまたはその他の非ゼロ数値を出力することを意図している場合は、STDOUTに書き込む必要があります。 – meagar

+0

ありがとう、@マガール。私は、私が作業している非生産コードの一時的なハックとして、私の組み込みコード開発を検証するためにこれを必要とします。あなたが言及した警告を理解していますが、それでも私の質問には答えません。 – ysap

+0

それは答えではなくコメントなのです。コメントは*疑問に答えるものではありません。一時的なハックかそうでなければ、あなたはあなたが戻ってきた番号を明かすことはできません。それをSTDOUTに出力する必要があります。 – meagar

答えて

1

戻り状況はwaitとそれに関連するシステムコールで説明されています。基本的

WEXITSTATUS(stat_val)
WIFEXITEDの値(stat_val)が非ゼロである場合、このマクロはに評価status引数の下位8ビットは、その子プロセスが_exit()またはexit()に渡されたか、または子プロセスがmain()から戻った値。

これは8ビットに制限されています。あなたはそれ以上の移植性を得ることはできません。 (そして、私はシステムに依存した方法は、より多くのいずれかを取得するのか分からない。)

3

説明はman exitの上部に右である:

つまり
 
    The exit() function causes normal process termination and the value of 
    status & 0377 is returned to the parent (see wait(2)). 

、唯一の最下位8ビットがに伝播されます親プロセス。

この点で、終了コードをmain()から返すことは、exit()に渡すことと同じです。

+0

ありがとうございます。私は実際に 'man bash'ページを見ましたが、そこにそれを見つけることができませんでした。私はb/cと思っていました。私はCをやっていましたが、私は 'exit'ページを見ていませんでした。 – ysap

関連する問題