プロセスが受信できるすべての信号に少し混乱することがあります。私が理解しているように、プロセスにはデフォルトのハンドラー(信号処理)があります。 )これらの信号ごとに、ただしsigaction()
を呼び出すことで独自のハンドラーを提供できます 。
だからここに私の質問があります:各信号が送信される原因は何ですか? -s
を介して実行中のプロセスに手動でシグナルを送信できることを理解しています kill
へのパラメータ 、しかしナチュラルとは何ですか これらの信号が送信される状況は?たとえば、SIGINT
はいつですか 送られますか?
また、どの信号を処理できるかについての制限はありますか? SIGSEGV
も可能 信号が処理され、制御がアプリケーションに戻されますか?
承認された回答:
kill(2)
を呼び出すプロセスに加えて 、いくつかの信号は、さまざまな状況でカーネルによって(またはプロセス自体によって)送信されます:
- ターミナルドライバーは、さまざまなイベントに対応する信号を送信します。
- キー押下通知:
SIGINT
(メインループに戻ってください) Ctrl + C 、SIGQUIT
(すぐに終了してください) Ctrl + 、SIGTSTP
(一時停止してください) Ctrl + Z 。キーはstty
で変更できます コマンド。 -
SIGTTIN
およびSIGTTOU
バックグラウンドプロセスがその制御端末に対して読み取りまたは書き込みを試みたときに送信されます。 -
SIGWINCH
ターミナルウィンドウのサイズが変更されたことを通知するために送信されます。 -
SIGHUP
は、端末が消えたことを通知するために送信されます(歴史的にはモデムに h があったため) ung up 、最近は通常、ターミナルエミュレータウィンドウを閉じたためです。
- キー押下通知:
- 一部のプロセッサトラップは信号を生成できます。詳細はアーキテクチャとシステムに依存します。典型的な例は次のとおりです。
-
SIGBUS
アラインされていないアクセスメモリの場合; -
SIGSEGV
マップされていないページへのアクセス用; -
SIGILL
違法な命令(不正なオペコード)の場合; -
SIGFPE
引数が正しくない浮動小数点命令の場合(例:sqrt(-1)
。
-
- いくつかのシグナルがターゲットプロセスに何らかのシステムイベントが発生したことを通知します:
-
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
UPSが停電が差し迫っていることを通知すると、すべてのプロセスに送信されます。
-
これらのリストは網羅的ではありません。標準信号はsignal.h
で定義されています 。
ほとんどの信号は、アプリケーションによってキャッチおよび処理(または無視)できます。キャッチできないポータブル信号はSIGKILL
の2つだけです。 (死ぬだけ)そしてSTOP
(実行を停止します)。
SIGSEGV
(セグメンテーション違反)とそのいとこSIGBUS
(バスエラー)をキャッチすることはできますが、自分が何をしているのかを本当に理解していない限り、それは悪い考えです。それらをキャッチするための一般的なアプリケーションは、スタックトレースまたはその他のデバッグ情報を出力することです。より高度なアプリケーションは、ある種のインプロセスメモリ管理を実装するか、仮想マシンエンジンに不正な命令をトラップすることです。
最後に、合図ではないことについて触れさせてください。 Ctrlを押したとき + D ターミナルから入力を読み取るプログラムの行の先頭で、これは入力ファイルの終わりに到達したことをプログラムに通知します。これはシグナルではありません。入出力APIを介して送信されます。 Ctrlのように + C と友達、キーはstty
で設定できます 。