2016-08-26 14 views
-1

私は最近、オペレーティングシステムのコースを開始しました。私は出力が何であるか把握する必要があるこの質問に出くわしました。 Explain this code's working; how the child process returns values and where?
私は戻り値が、親でインクリメントし、印刷された子プロセスからのvalに返される方法を理解する - これは、この記事にSOの前に回答されているこのコードスニペットの出力が異なるのはなぜですか?

int main() { 
    int val = 5; 
    if(fork()) { 
    wait(&val); 
    } 
    val++; 
    printf("%d ", val); 
    return val; 
} 

- ここでは、コードですそのロジックに従った出力は実際には6 7

しかし、コードを自分で実行しようとしたとき、私はまったく異なるものを得ているようです。私は出力6 1537を取得します。インクリメントを削除すると出力が得られます - 6 1280
これは、返される値がval * 256であり、valだけではないことを意味します。 )。私はインターネット上で説明を探してみましたが、答えが見つからないようです。誰がここで起こっていることを説明できるなら、本当に助けになるでしょう。

+1

コードの字下げは、実際に起こっていることに似ていません。 –

+1

閉じ括弧が欠けているようです(または開き括弧が1つ多い)。 – WhozCraig

+0

はい、そこに閉じ括弧を含めるのを忘れました。 – Zeokav

答えて

1

wait()システムコールは、子プロセスの戻り値だけでなく、wait()の戻り値よりも多くの値を返します。実際、下位8ビットだけが返された値であり、上位ビットはステータスフラグであり、他のものの中でどのように子供がどのように出ていったか(例えば信号によって)を示します。子供からの戻り値を得るには、wait()の直後に

val = WEXITSTATUS(val); 

を使用します。

+0

私はこれを見つけました。だから基本的にWEXITSTATUSを使わずに返される値は常に8ビットだけシフトされますか? – Zeokav

+0

古典的には、16ビットステータスの上位8ビットは終了ステータスであり、下位8ビットはプロセスが正常に終了したかどうか(上位ビットが意味を持つかどうか)シグナルの結果(この場合、どのシグナルが死を引き起こしたか、そしてコアダンプが作成されたかどうかを判断できますが、上位ビットには有用な情報は含まれていません)。これは、あなたが描いているように見えるものの逆です。 –

+0

これは、混乱は[exit() '](http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html)に渡されるものと[' waitpid () ''(http://pubs.opengroup.org/onlinepubs/9699919799/functions/waitpid.html)または 'wait()'を参照してください。 'exit()'に渡された値の下位8ビットは、親プロセスが利用できるようになります。しかし、 'waitpid()'や 'wait()'によって返される値は通常、ビット15-8の終了ビットを持ちますが、ビット7-0にはシグナル情報が含まれています(POSIXはそのレイアウトを必要としませんが、それでも観察される)。 –

関連する問題