GNU/Linux >> Linux の 問題 >  >> Linux

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

プロセスが受信できるすべての信号に少し混乱することがあります。私が理解しているように、プロセスにはデフォルトのハンドラー(信号処理)があります。 )これらの信号ごとに、ただし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によって殺される 。
    • SIGPOLLSIGIOとも呼ばれます )ポーリング可能なイベントが発生したことをプロセスに通知します。 POSIXは、I_SETSIGを介して登録されたポーリング可能なイベントを指定します ioctl 。多くのシステムでは、O_ASYNCを介して設定された任意のファイル記述子でポーリング可能なイベントを許可しています。 fcntl 国旗。関連するシグナルはSIGURGです。 、デバイス上の緊急データを通知します(I_SETSIGを介して登録されます ioctl )またはソケット。
    • 一部のシステムでは、SIGPWR UPSが停電が差し迫っていることを通知すると、すべてのプロセスに送信されます。
関連:Linux – Linuxでのユニオンマウント?

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

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

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

最後に、合図ではないことについて触れさせてください。 Ctrlを押したとき + D ターミナルから入力を読み取るプログラムの行の先頭で、これは入力ファイルの終わりに到達したことをプログラムに通知します。これはシグナルではありません。入出力APIを介して送信されます。 Ctrlのように + C と友達、キーはsttyで設定できます 。


Linux
  1. 中断できないプロセスとは何ですか?

  2. すべてのディスク IO を使用しているプロセス

  3. 何が私のプロセスを殺したのか、そしてその理由は?

  1. Ctrl + C でプロセスを強制終了できない場合はどうすればよいですか?

  2. Linuxでのセッションの定義は何ですか?

  3. 保留中のシグナルとは?

  1. このX11ウィンドウを作成したプロセスは何ですか?

  2. `ps`の「セッションリーダー」とは何ですか?

  3. Psの出力にはどういう意味がありますか?