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

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

時には、プロセスが受信できるすべての信号に対して少し混乱することがあります。私が理解したのは、プロセスには基本ハンドラ(信号処理)各信号に対して呼び出されますが、独自のハンドラを提供できます。sigaction()

私の質問は次のとおりです。各信号が送信される原因は何ですか?-sの引数を介して実行中のプロセスに手動でシグナルを送信できることを知っていますがkill自然これらの信号はどのような状況で送信されますか?たとえば、いつSIGINT出荷されますか?

また、どの信号を処理できるかについて制限がありますか?SIGSEGV信号を処理してアプリケーションに制御を返すことは可能ですか?

ベストアンサー1

プロセスコールに加えてkill(2)、一部シグナルさまざまな状況でカーネル(または時にはプロセス自体)によって送信されます。

  • 端末ドライバは、様々なイベントに対応する信号を送信する。
    • キー押下通知: SIGINT(メインループに戻ります) On Ctrl+ CSIGQUIT(すぐに終了してください)on Ctrl+ \SIGTSTP(しばらくしてください)Ctrl+ Z。次のコマンドを使用してキーストロークを変更できますstty注文する。
    • SIGTTINそしてSIGTTOUバックグラウンド・プロセスが制御端末から読み書きするときに送信されます。
    • SIGWINCH端末ウィンドウのサイズが変更されたことを示す信号を送信します。
    • SIGHUP端末が消えたことを知らせます(歴史的にモデムが消えたため)。時間ウォン戻る(これは通常、端末エミュレータウィンドウを閉じたためです)。
  • 一部のプロセッサトラップは信号を生成できます。詳細はアーキテクチャとシステムによって異なります。以下は一般的な例です。
    • SIGBUSメモリへのソートされていないアクセスの場合。
    • SIGSEGVマップされていないページにアクセスするために使用されます。
    • SIGILL無効な命令(無効なオペコード)
    • SIGFPEパラメータが無効な浮動小数点コマンドの場合(例sqrt(-1):)
  • 多くの信号は、特定のシステムイベントが発生したことをターゲットプロセスに通知します。
    • SIGALRM設定されたタイマーの有効期限が切れたことをプロセスに通知します。タイマーは次のように設定できます。alarmsetitimer他の人。
    • SIGCHLD子プロセスの1つが終了したことをプロセスに通知します。
    • SIGPIPEfoo | 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

おすすめ記事