Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxシグナルシグナル処理メカニズム

Linuxシグナルシグナル処理メカニズム

  

シグナルはLinuxプログラミングの重要な部分であり、シグナルメカニズムの基本概念、Linuxシグナルメカニズムの一般的な実装、シグナルの使い方、シグナルに関するいくつかのシステムコールを紹介します。 。

シグナルメカニズムはプロセス間でメッセージを転送する方法で、シグナルはソフト割り込みシグナルと呼ばれ、一部の人々はそれをソフト割り込みと呼びます。その名前からわかるように、その本質と用途は中断と非常によく似ています。したがって、シグナルはプロセス制御の一部であると言えます。

まず、シグナルの基本的な概念

このセクションでは、まずシグナルの基本的な概念を紹介し、次にシグナルに対応する基本的なシグナルの種類とイベントをいくつか紹介します。基本概念は、信号を理解し使用するために特に重要です。信号とは何かを見てみましょう。

1.基本概念

非同期イベントが発生したことをプロセスに通知するために、ソフト割り込み信号(signal、signalとも呼ばれます)が使用されます。プロセスは、システムコールkillを介して互いにソフト割り込み信号を送信できます。カーネルは、内部イベントのためにプロセスにシグナルを送り、イベントが発生したことをプロセスに通知することもできます。シグナルは、何が起こったのかをプロセスに通知するためだけに使用され、データをプロセスに渡すことはありません。

シグナルを受信するプロセスは、さまざまなシグナルに対して異なる処理方法を持ちます。処理方法は3つのカテゴリに分けられます:最初のものは割り込みに似たハンドラ処理される必要があるシグナルのために、プロセスは関数によって処理されるハンドラを指定することができます。 2番目の方法は、シグナルを無視して、あたかもそれが起こらなかったかのように何もしないことです。 3番目の方法は、このシグナルを処理するためにシステムのデフォルト値を保持することですこのデフォルト操作、ほとんどのシグナルのデフォルト操作は、プロセスを終了することです。プロセスはシステムを介してシグナルを呼び出し、特定のシグナルに対するプロセスの処理動作を指定します。

プロセステーブルのテーブルにはソフト割り込みシグナルフィールドがあり、このフィールドの各ビットはシグナルに対応し、シグナルがプロセスに送信されると、対応するビットが設定されます。プロセスは異なる信号を同時に保持することができるが、同じ信号の場合、プロセスは処理の前に何回知らないかがわかります。

2.シグナルの種類

シグナルを送る理由に応じてシグナルを分類することができます:

(1)とプロセス終了関連シグナルこのタイプのシグナルは、プロセスの終了時または子プロセスの終了時に発行されます。 (2)プロセス例外イベントに関連したシグナル。プロセスが範囲外の場合、または読み取り専用メモリ領域(プログラム本体領域など)を書き込もうとしている場合、あるいは特権命令やその他のさまざまなハードウェアエラーを実行しようとしている場合。 (3)システム呼び出し中に発生した回復不能状態に関連したシグナル。システムコールexecが実行されると、元のリソースは解放され、現在のシステムリソースは使い果たされます。 (4)システムコールの実行中に発生した非予測エラー状態に関連するシグナル。たとえば、存在しないシステムコールを実行します。 (5)ユーザーモードのプロセスからのシグナル。たとえば、プロセスは他のプロセスにシグナルを送信するためにシステムコールkillを呼び出します。 (6)端末相互作用に関連する信号。たとえば、ユーザーが端末を閉じるか、またはブレークボタンを押すとします。 (7)プロセスによって実行されたシグナルを追跡します。

Linuxがサポートしているシグナルの一覧は以下の通りです。多くのシグナルはマシンのアーキテクチャーに関連していますが、最初にリストされているのはPOSIX.1にリストされているシグナルです:

シグナル値処理アクションシグナルがなぜ使われるのか----------- -------------------------------------------------- --------- SIGHUP 1 A端末が一時停止または制御プロセスが終了します。SIGINT 2 Cキーボード割り込み(例:ブレークボタンが押された場合)SIGQUIT 3 Cキーボード終了キーが押された場合SIGILL 4 C不正なコマンドSIGABRT 6 C abort(3)によって発行された終了コマンドSIGFPE 8 C浮動小数点例外SIGKILL 9 AEFキルシグナルSIGSEGV 11 C無効なメモリ参照SIGPIPE 13 Aパイプブレーク:alarm(2)によって発行された読み出しポートなしでパイプSIGALRM 14 Aを書き込む。シグナルSIGTERM 15 A終了シグナルSIGUSR 1 30、10、16 Aユーザー定義シグナル1 SIGUSR 2 31、12、17 Aユーザー定義シグナル2 SIGCHLD 20、17、18 Bサブプロセス終了シグナルSIGCONT 19、18、25処理を継続する(停止したプロセス)SIGSTOP 17,19,23 DEFプロセスを終了するSIGTSTP 18,20,24 D制御端末の停止ボタンSIGTTIN 21,21,26 Dを押す(tty)バックグラウンドプロセスは制御端末22,22からSIGTTOUを読み込もうとします。 、27 D舞台裏制御端末から書き込みをしようとしています

次のシグナルはPOSIX.1にはリストされていませんが、

シグナル値処理アクションの理由はSUSv2にリストされています-------- -------------------------------------------------- ---------- SIGBUS 10,7,10 Cバスエラー(誤ったメモリアクセス)SIGPOLL Sys V定義のPollableイベント、SIGIOと同義。SIGPROF 27,27,29 SIGSYSへのプロファイリングタイマー12、 - 、12 C無効なシステムコール(SVID)SIGTRAP 5 Cトレース/ブレークポイントキャプチャSIGURG 16,23,21 Bソケット緊急状態(4.2 BSD)SIGVTALRM 26,26,28 A実時間アラームクロック信号(4.2 BSD)SIGXCPU 24、24、30 Cが設定CPU時間制限(4.2 BSD)を超えていますSIGXFSZ 25、25、31 Cが設定ファイルサイズ制限(4.2 BSD)を超えています。

(SIGSYS、SIGXCPUの場合、 SIGXFSZ、および特定のマシンアーキテクチャーではSIGBUSでは、LinuxのデフォルトはA(終了)、SUSv2からC(終了およびダンプコア)です。

以下に他のシグナルをいくつか示します。

シグナル値処理アクションがシグナルを出す理由------------------------ ---------------------------------------------- SIGIOT 6 C IO SIGABRTと同義のキャプチャー命令SIGEMT 7、 - 、7 SIGSTKFLT - 、16、 - コプロセッサスタックエラーSIGIO 23,29,22 A入出力操作が可能になりました(4.2 BSD)SIGCLD - 、 - 、、 18 A SIGCHLDと同義です。SIGPWR 29,30,19 A停電(System V)SIGINFO 29、 - 、 - A SIGPWRと同義です。SIGLOST - 、 - 、 - ファイルロックが失われました。SIGWINCH 28,28,20 Bウィンドウサイズの変更(4.3 BSD、Sun)SIGUNUSED - 、31、 - 未使用のシグナル(SIGSYSになります)

(ここでは、 - シグナルは実装されていないことを示します。意味を示す3つの値があります。)値は通常AlphaとSparcで有効で、i386とppcとshでは中央、mipsでは最後の値になりますシグナル29はAlphaではSIGINFO /SIGPWR、SparcではSIGLOSTです。

処理動作Aデフォルトの動作はプロセスBを終了すること、デフォルトの動作はこのシグナルを無視すること、Cデフォルトの動作はプロセスを終了してカーネルを実行することです。コアDをダンプDデフォルトでは、プロセスを停止しますE信号はキャプチャできませんF信号は無視できません。

上記のシグナルは一般的なシステムでサポートされています。さまざまな信号の名前、効果、および処理アクションは、表形式で説明されています。さまざまなデフォルトの処理アクションの意味は次のとおりです。プログラムの終了とはプロセスの終了を指し、シグナルを無視すると対処しない、プログラムの停止とはプログラムがハングすることを意味します。デバッグプロセス(たとえば、ptraceシステムコール)中に、カーネルイメージダンプとは、メモリ内のプロセスデータとカーネル構造体に格納されているプロセスの一部のイメージを特定の形式でファイルシステムにダンプし、実行を終了することです。利点は、実行時にプロセスのデータ値を取得して、ダンプの理由を判断したりプログラムをデバッグしたりすることができるという便利さをプログラマに提供することです。

Copyright © Windowsの知識 All Rights Reserved