Linuxアプリケーションの開発と信号処理

Linuxアプリケーションの開発と信号処理

現在、ユーザーが自分のアプリが終了していると文句を言う問題があります。特定の(ランダムに見える)条件およびデスクトップ環境では、アプリケーションは終了せず、再起動時に設定は保存されません。私は関連IRCチャネルに連絡しましたが、ほとんどの場合、信号を正しく処理するように言われました。端末のCtrl-CについてはSIGINTを知り、「正常な」終了についてはSIGTERMを知っています。しかし、SIGHUPも重要だと聞きました。だから私の質問は次のようになります

正しく動作するアプリケーションを構築するには、どの信号を処理する必要がありますか?

ベストアンサー1

https://en.wikipedia.org/wiki/Unix_signal

標準信号と基本動作のリストがあります。十分な権限を持つプロセスは常にユーザーにシグナルを送信できますが、プロセス(またはプロセスを介してユーザー)はそうしないでください。

あなたはあなたのプロセスが使用することを期待してkill使用する必要がありますkill学期送信する特定の信号をターゲットが処理しているかどうかを知らない限り、環境(シェル、ターミナルドライバ)によって生成される可能性がある複数の信号。

基本信号をタスクごとに並べ替えることができます。

コアダンプ信号

ABRT TRAP SYS BUS FPE ILL SEGV   XFSZ XCPU QUIT

一部の特殊機能(TRAP、ABRT、SYS)を使用するか、ハードエラー状態(BUS、FPE、ILL、SEGV)を入力することによって生成されます。 QUITコアダンプが必要な端末でユーザーが生成します(C+\)。

デフォルト設定のままにしておくこともできます。

アウト終了信号:

HUP INT PIPE TERM ALRM POLL PROF USR1 USR2

あなたは期待する必要があります

HUP INT PIPE TERM

さまざまな状況で環境がどのように見えるかによって:

HUP -- when the terminal hungs up or you become a stopped orphaned process
INT -- when the user at the terminal interrupts you with C-c
PIPE -- when a PIPE or socket you write into closes, e.g. by
        exiting before you finished writing to it 
       (`yourprogram | (exit)` will give you a `PIPE` 
        if yourprogram attempts to write to its STDOUT) 
TERM -- when a process ends you a normal termination request

残りの終了信号は、直接設定した場合にのみ受信する必要があります。

殺すそして止めるあなたができることは何もありません。

端末の生成を傍受したい場合があります。停止信号:

TTIN -- you read from the terminal and you're a backgrounded process
TTOU -- you write the terminal when you're a backgrounded process
        and the terminal is set to put you to sleep when you do
TSTP -- you're being put to sleep with `C-Z`

しかし、最悪の場合、これはあなたの地位を破壊することなくあなたの進行を中断するだけです。

CHLDCONTまたはを処理する必要があることを知らない限り、それはURG必要ありません。

簡単に言うと:

基本的に、通常、事前終了クリーンアップを実行するには、HUP、INT、PIPE、およびTERMを処理(または無視)する必要があると思います。プログラムがこれらの信号を使用しない場合、またはすべての場合に絶対にクリーンアップが必要な場合を除き、残りはそのままにすることができます。

後者の場合、未処理のすべての信号を空白でブロックできますが、信号ブロックマスクは分岐呼び出しとexecve呼び出しの間に継承され、ILLなどの信号は処理中に無視またはブロックされます。実行時に生成して送信しません。 killまたはsigqueueを介してそれらを渡すと、未定義の動作が発生します。

詳しくは、マンページと標準をご覧ください。シグナルはUnixで非常に大きなトピックであり、それを扱うのは難しいかもしれません。

おすすめ記事