時には、プロセスが受信できるすべての信号に対して少し混乱することがあります。私が理解したのは、プロセスには基本ハンドラ(信号処理)各信号に対して呼び出されますが、独自のハンドラを提供できます。sigaction()
。
私の質問は次のとおりです。各信号が送信される原因は何ですか?-s
の引数を介して実行中のプロセスに手動でシグナルを送信できることを知っていますがkill
、自然これらの信号はどのような状況で送信されますか?たとえば、いつSIGINT
出荷されますか?
また、どの信号を処理できるかについて制限がありますか?SIGSEGV
信号を処理してアプリケーションに制御を返すことは可能ですか?
ベストアンサー1
プロセスコールに加えてkill(2)
、一部シグナルさまざまな状況でカーネル(または時にはプロセス自体)によって送信されます。
- 端末ドライバは、様々なイベントに対応する信号を送信する。
- キー押下通知:
SIGINT
(メインループに戻ります) On Ctrl+ C、SIGQUIT
(すぐに終了してください)on Ctrl+ \、SIGTSTP
(しばらくしてください)Ctrl+ Z。次のコマンドを使用してキーストロークを変更できますstty
注文する。 SIGTTIN
そしてSIGTTOU
バックグラウンド・プロセスが制御端末から読み書きするときに送信されます。SIGWINCH
端末ウィンドウのサイズが変更されたことを示す信号を送信します。SIGHUP
端末が消えたことを知らせます(歴史的にモデムが消えたため)。時間ウォン戻る(これは通常、端末エミュレータウィンドウを閉じたためです)。
- キー押下通知:
- 一部のプロセッサトラップは信号を生成できます。詳細はアーキテクチャとシステムによって異なります。以下は一般的な例です。
- 多くの信号は、特定のシステムイベントが発生したことをターゲットプロセスに通知します。
SIGALRM
設定されたタイマーの有効期限が切れたことをプロセスに通知します。タイマーは次のように設定できます。alarm
、setitimer
他の人。SIGCHLD
子プロセスの1つが終了したことをプロセスに通知します。SIGPIPE
foo | bar
読み取り側が閉じている間にプロセスがパイプに書き込もうとしたときに生成されます(実行して終了するとbar
終了foo
するという概念ですSIGPIPE
)。SIGPOLL
(とも呼ばれるSIGIO
)ポーリング可能なイベントが発生したことをプロセスに通知します。 POSIXは、以下を介して登録されたポーリング可能なイベントを指定します。I_SETSIG
ioctl
。多くのシステムでは、次のすべてのファイル記述子でポーリング可能なイベントを許可します。O_ASYNC
fcntl
バナー。関連信号はSIGURG
、機器に緊急データを通知する(登録I_SETSIG
ioctl
) またはソケット。- 一部のシステムでは
SIGPWR
すべてのプロセスに転送されるときアップ停電が差し迫ったことを示します。
このリストは完全なものではありません。標準信号は次のように定義されます。signal.h
。
ほとんどの信号はアプリケーションによってキャプチャおよび処理(または無視)できます。キャプチャできない唯一のポータブル信号は2つでした。SIGKILL
(ただ死ぬ)とSTOP
(実行を中止します)。
SIGSEGV
(セグメンテーションエラー)と彼のいとこSIGBUS
(バスエラー)捕まえるかもしれませんが、自分がしていることを実際に知らない限り悪い考えです。これをキャプチャするための一般的なアプリケーションは、スタックトレースやその他のデバッグ情報を印刷することです。より進化したアプリケーションは、ある種のプロセス内メモリ管理を実装するか、仮想マシンエンジンで誤ったコマンドを見つけることです。
最後に、信号ではないことについて言及します。端末から入力を読み取るプログラムの行の先頭でCtrl+を押すと、プログラムはD入力ファイルの終わりに達したことを知らせます。これは信号ではありません。入力/出力APIを介して送信されます。 Like Ctrl+CとFriendsを使用してボタンを設定できますstty
。