さまざまな信号が送信される原因は何ですか?


28

プロセスが受信できるすべての信号に、少し混乱することがあります。私が理解しているように、プロセスにはこれらの各シグナルにデフォルトのハンドラー(signal disposition)がありますが、を呼び出すことで独自のハンドラーを提供できますsigaction()

だからここに私の質問があります:各信号が送信される原因は何ですか?の-sパラメータを使用してkill、実行中のプロセスに手動で信号を送信できることを理解していますが、これらの信号が送信される自然な状況は何ですか?たとえば、いつSIGINT送信されますか?

また、処理できる信号に制限はありますか?SIGSEGV信号さえ処理し、制御をアプリケーションに戻すことができますか?


これに対する適切な答えは叙事詩であり、基本的にこの問題に関するウィキペディアの記事の情報を複製するので、私はただそこを指し示します。
ショーンJ.ゴフ

@Shawn:ウィキペディアの記事にはシグナルのリストがありますが、誰がどのシグナルを送信したかについての明確なプレゼンテーションはありません。
ジル 'SO-悪である停止

回答:


41

プロセスの呼び出しkill(2)に加えて、いくつかのシグナルがさまざまな状況でカーネルによって(またはプロセス自体によって)送信されます。

  • ターミナルドライバーは、さまざまなイベントに対応する信号を送信します。
    • キーを押し通知: SIGINT上(バックメインループにアクセスしてください)Ctrl+ CSIGQUIT(すぐに終了してください)上のCtrl+は\SIGTSTP上の(一時停止してください)Ctrl+ Z。キーはsttyコマンドで変更できます。
    • SIGTTINそしてSIGTTOUバックグラウンド・プロセスは、その制御端子にリードまたはライトしようとしたときに送信されます。
    • SIGWINCH 端末ウィンドウのサイズが変更されたことを通知するために送信されます。
    • SIGHUP端末が消えたことを信号に送られる(モデムが持っていたので、歴史的に時間 UNG アップを、最近では通常、あなたは、端末エミュレータ・ウィンドウを閉じたので)。
  • 一部のプロセッサトラップは信号を生成できます。詳細はアーキテクチャとシステムに依存しています。典型的な例を次に示します。
    • SIGBUS アライメントされていないアクセスメモリの場合。
    • SIGSEGV マップされていないページへのアクセス。
    • SIGILL 不正な命令(不正なオペコード);
    • SIGFPE不正な引数を持つ浮動小数点命令の場合(例sqrt(-1)
  • いくつかのシグナルが、ターゲットプロセスに何らかのシステムイベントが発生したことを通知します。
    • SIGALRMプロセスによって設定されたタイマーが期限切れになったことを通知します。タイマーはalarmsetitimerなどで設定できます。
    • SIGCHLD 子の1つが死亡したことをプロセスに通知します。
    • SIGPIPE読み取りエンドが閉じられたときにプロセスがパイプに書き込もうとすると生成されます(実行foo | barしてbar終了すると、fooによって殺されるという考えですSIGPIPE)。
    • SIGPOLL(とも呼ばれますSIGIO)は、ポーリング可能なイベントが発生したことをプロセスに通知します。POSIXは、を通じて登録されたポーリング可能なイベントを指定しますI_SETSIG ioctl。多くのシステムは、O_ASYNC fcntlフラグを介して設定されたファイル記述子でポーリング可能なイベントを許可します。関連する信号はSIGURG、(デバイス経由で登録されたI_SETSIG ioctl)またはソケットの緊急データを通知します
    • 一部のシステムでSIGPWRは、電源障害が差し迫っていることをUPSが通知すると、すべてのプロセスに送信されます

これらのリストは完全ではありません。標準信号はで定義されていsignal.hます。

ほとんどの信号は、アプリケーションによってキャッチおよび処理(または無視)できます。キャッチできない2つのポータブル信号は、SIGKILL(ただ死ぬ)とSTOP(実行を停止する)だけです。

SIGSEGVセグメンテーションフォールト)とその従兄弟SIGBUSバスエラー)をキャッチできますが、何をしているのか本当に理解していない限り、それは悪い考えです。それらをキャッチする一般的なアプリケーションは、スタックトレースまたはその他のデバッグ情報の出力です。より高度なアプリケーションは、ある種のインプロセスメモリ管理を実装するか、仮想マシンエンジンの不適切な命令をトラップすることです。

最後に、シグナルではない何かについて言及させてください。端末から入力を読み取るプログラムの行の先頭でCtrl+ を押すDと、入力ファイルの最後に到達したことがプログラムに通知されます。これはシグナルではなく、入出力APIを介して送信されます。Ctrl+ Cや友人と同様に、キーはで設定できますstty


そして、SIGHUP、モデムがハングアップしました。:-)
キース

1
注意すべきもう1つの点SIGFPEは、やや直感的ではないが、ゼロによる整数除算、および場合によっては符号付き整数オーバーフローで通知されます。
一時的な

18

:最初の2つ目の質問に答えるために、SIGSTOPSIGKILLさえ、アプリケーションによってキャッチすることはできませんが、他のすべての信号缶SIGSEGV。このプロパティはデバッグに役立ちます。たとえば、適切なライブラリサポートSIGSEGVを使用すると、スタックバックトレースをリッスンして生成し、そのセグメンテーション違反が発生した場所を表示できます。

man 7 signalLinuxのコマンドラインから入力することにより、各信号の機能に関する公式の言葉(とにかくLinuxの場合)を利用できます。 http://linux.die.net/man/7/signalにも同じ情報がありますが、表は読みにくいです。

ただし、信号に関するある程度の経験がなければ、それらが実際に何をするのかを短い説明から知ることは難しいので、ここに私の解釈があります。

キーボードからトリガー

  • SIGINTヒットすると発生しますCTRL+C
  • SIGQUITによってトリガーされCTRL+\、コアをダンプします。
  • SIGTSTPを押すと、プログラムが中断されますCTRL+Z。とは異なりSIGSTOP、キャッチ可能であり、プログラムをvi停止する前に端末を安全な状態にリセットする機会をプログラムに与えます。

ターミナルインタラクション

  • SIGHUP (「ハングアップ」)は、プログラムの実行中にxtermを閉じる(または端末を切断する)と発生します。
  • SIGTTINまたSIGTTOU、バックグラウンドで実行中に端末から読み取りまたは書き込みを試みた場合、プログラムを一時停止します。そのSIGTTOUためには、プログラムが/dev/ttyデフォルトのstdoutだけでなく、に書き込む必要があると思います。

CPU例外によってトリガーされます

これらは、プログラムが何か間違ったことをしようとしたことを意味します。

  • SIGILL違法または未知のプロセッサ命令を意味します。これは、たとえばプロセッサI / Oポートに直接アクセスしようとした場合に発生する可能性があります。
  • SIGFPEハードウェアの数学エラーがあったことを意味します。ほとんどの場合、プログラムはゼロで除算しようとしました。
  • SIGSEGV プログラムがメモリのマップされていない領域にアクセスしようとしたことを意味します。
  • SIGBUSプログラムが他の方法でメモリに誤ってアクセスしたことを意味します。この概要の詳細は説明しません。

プロセスの相互作用

  • SIGPIPEパイプのリーダーが終端を閉じた後にパイプに書き込もうとすると起こります。をご覧くださいman 7 pipe
  • SIGCHLD作成した子プロセスが終了するか、中断される(SIGSTOPまたは同様の)場合に発生します。

自己シグナリングに便利

  • SIGABRT通常、abort()関数を呼び出すプログラムが原因で、デフォルトでコアダンプが発生します。「パニックボタン」の並べ替え。
  • SIGALRM引き起こされるalarm()カーネルが提供するようになりますシステムコール、SIGALRM指定した秒数後にプログラムに。man 2 alarmおよびを参照してくださいman 2 sleep
  • SIGUSR1そしてSIGUSR2プログラムが好きしかし、使用されています。それらはプロセス間のシグナル伝達に役立つ可能性があります。

管理者から送信された

これらの信号は通常介して、コマンドプロンプトから送信されたkillコマンド、またはfgまたはbgの場合にはSIGCONT

  • SIGKILLSIGSTOPは、ブロックできないシグナルです。最初は常にプロセスを直ちに終了します。2番目はプロセスを中断します。
  • SIGCONT 中断されたプロセスを再開します。
  • SIGTERMは、のキャッチ可能なバージョンですSIGKILL

shutdownコマンドを使用すると、どの信号が送信されますか?
ネイサンオスマン

これはシャットダウンスクリプトに依存します。通常、SIGTERM最初に送信され、次に遅延が続き、が続き SIGKILLます。原則として、ハードで即時のシャットダウンの場合、カーネルはシグナルを送信する必要はまったくありません。プロセスの実行を停止するだけです。
ジャンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.