2016-09-01 9 views
6

私はsystemdに切り替えたばかりで、きれいに殺されたプロセスがうまくいっていないと考えているので、しばらくこのことをやっているかもしれません。シグナルを受け取った場合、私のプログラムの終了コードはどうすればよいですか?

基本的に、私はきれい例えば(mainにバックアップ信号のコードを通すことによって)、次いでSIGHUPSIGINTSIGTERMリッスンとreturn 128+SIGHUP

信号が未処理だった場合にのみ、私は、これは$?を移入するために使用されることが期待が、今私はシェルが$?に、このような値を与えるために責任があることを理解だと思うし、その後。信号が処理されたためにプロセスが最終的に信号を出したとしても、$?0になり、信号が存在していることと関係があるというすべての証拠は失われます。そうですか?

SIGHUPを処理しても正常に終了する場合は、return EXIT_SUCCESSからmainにする必要がありますか?

+0

私はそれが依存すると思います。信号による終了がバイナリの正常な実行と見なされた場合は、はいとなります。これらの信号がエラーを示す場合は、EXIT_FAILURE。 – Hayt

+0

@Hayt:シグナルコードをプロセス終了コードに組み込むには、何もしてはいけないということです。 –

+0

あなたのプログラムがそのタスクで失敗したという兆候が解消されているか、ハングアップしていますか? – StoryTeller

答えて

5

128 + <signal number>を返すの規則は特に高度なバッシュスクリプトガイド(https://stackoverflow.com/a/1535733/567292)が推進する、しかし、あなたのプログラムが信号を受信した結果としてに失敗した場合にのみ場合のためです。

あなたのプログラムが信号を受信した場合、はそれを処理せず、結果として終了し、(waitによって提供などなど)終了ステータスは似ていますが、代わりにビット7セットの上位ビットがセットされていますWIFEXITEDではなく、WIFSIGNALEDを示します。シェルで実行している場合は、translated by the shellで終了ステータス($?)を128〜255(つまり、ビット7が設定されている)にします。シェルスクリプトに関する限り、128+nを返すプログラムは

[...]特殊なパラメータ '?'を使用して終了ステータスを報告する場合、シェルは利用可能な終了ステータスの全8ビットを報告しなければなりません。それは、信号を受信したため終了したコマンドの終了ステータスは、あなたのプログラムは、信号、その後に成功終了を受信した場合、これは正常終了とみなされるので、あなたのプログラムがすべきより大きい128

として報告されなければなりません返信EXIT_SUCCESS

+1

パーフェクト、ありがとう:)これは、私のイベントフレームワークの「バグ」になってから約6年間です。おっと... –

2

リターンコードは通常、指定するものです。コードを終了させるためにシグナルを含める場合は、シグナルが一意にとどまるようにする必要があります。

終了コードにシグナルが必要ない場合は、シグナルを含める理由がないようです。

EXIT_SUCCESSまたはEXIT_FAILUREを返すかどうかは、終了が成功か失敗かによって決まります。

関連する問題