プロセス間通信のLinuxの###信号(sinal)

コンピュータサイエンスでは、信号は、Unix、Unixライクな、およびその他のPOSIX準拠のオペレーティングシステムのうちの1種類、通信プロセスが制限された方法があります。これは、非同期の通知メカニズムである、警告イベントに使用されるプロセスが発生しました。信号がプロセスに送信されると、オペレーティングシステムの割込み制御の正常な流れ、このときの処理は、任意の非アトミック動作が中断されます。プロセスは、信号処理機能が定義されている場合、そうでなければ、デフォルトのハンドラを実行し、実行されます。

ソフト割り込み信号(信号、及びショート用信号)が発生した非同期イベントの処理を通知するために使用されます。あなたは、ソフト割り込み信号がプロセス間でシステムを経由して送信され互いにキルを呼び出すことができます。カーネルはまたため、内部イベント、イベント通知処理の発生のプロセスにシグナルを送ることができます。信号が唯一のイベントを何が起こったかのプロセスを通知するために使用されることに注意してください、このプロセスは、任意のデータを転送することはありません。プロセス受信信号は様々な信号への異なるアプローチを持っています。治療の方法は、3つのカテゴリに分けることができる:最初の割り込みハンドラと同様であり、信号処理機能によって処理するための処理機能を指定することができ、処理されます。第2の方法は、信号を無視することで、信号がちょうど起きていない、何の治療法ではありません。第三の方法は、信号処理システムが保持され、このようなデフォルト動作のデフォルト値であり、デフォルトのアクションは、信号処理終了の最もことです。プロセスは、システムを介して信号呼び出し信号を処理するためのプロセスの動作を指定します。ソフト割り込み信号領域におけるプロセス・テーブルのエントリがあり、信号がプロセスに送信された信号に対して、各ビット対応のドメインは、対応するビットが設定されています。プロセスが同時に異なる信号のために確保することができ、見ることができますが、同じ信号のために、プロセスは、処理の前に来てどのように多くのを知りません。

セマフォ信号およびこれら2つの用語は、1つの単語だけ、時には我々は、これら2つのことを考えることは非常に簡単になりますがものではありませんが、それは2つの完全に異なる概念です。

  • 信号は:システムまたは例外の状態を変更するには、ターゲット・プロセスに通知するために、ターゲット・プロセスへのユーザー、システム、またはプロセス情報が送信されます。通知プロセスは、イベントを生成します
  • セマフォセマフォは特別な変数であり、その本質は、セマフォ重要なリソースの数、セマフォの値が上にあるどのくらいどのように多くの、多くの、そのすべてのアトミック操作にアクセスするプロセス(PV操作を記録するカウンタであります、P:フットプリント、V:リリースリソース)。その役割は、協調プロセスが同時にクリティカルセクションがアクセスそれに唯一のプロセスであるように、共有リソースへのアクセスということです。(共有リソースへの協調プロセスへのアクセス用)の同期処理のための

次のような状況では、信号が発生する可能性があります

  • キーボードイベント   このようなSIGINT信号生成CTRL + C、CTRL + \ SIGQUIT生成された信号、CTRL + Z信号生成SIGTSTPとして
  • ハードウェア例外   ハードウェア障害。0以外の不正アクセスメモリ(バーストエラー)、(浮動小数点例外)、メモリアライメントエラー(バスエラー)信号を生成するハードウェア及び通知カーネルによって検出され、カーネルは、次いで、実行されるゼロによる除算のように、プロセスに適切な信号を送ります。命令は、メモリアドレスにアクセスする不正プロセス、CPU演算部は、例外を生成カーネル信号がプロセスに送信されるように、例外が解釈されます。
  • システムコール   のkill、アボート、昇給システム関数呼び出しなど
  • ソフトウェア条件   タイマーのアラームを使用して
  • システム・コマンド・    キル

信号は、信号が到着したときに、現在の実行環境の保存、信号処理機能を実行するためにターンシグナルハンドラが完了したときに、復旧サイトは、引き続き、非同期イベントです。

プロセス信号は、3つの処理モードを受信しました

  • デフォルト:デフォルトのアクションは、それがSIGINTシステムであれば、このプロセスは中断され、信号処理を実行します
  • 無視:私たちは、信号を扱うしていない、SIGKILL SIGSTOPを無視することはできません見ないふり
  • キャプチャと処理:信号が来たときに、機能を処理する信号を提供するために、私たち自身を書き込むための実行コードは、この処理機能を実行するために、ユーザーモードからの信号を処理するときに、スイッチにコアを必要とする(信号を捕捉し、このアクションは、我々が行わ必要です)SIGKILL SIGSTOPをキャプチャすることはできません

信号をサインアップ

typedef void  (* sighandler_t) (int);
sighandler_t signal (int signum   /*要注册的信号*/, sighandler_t handler /*信号执行函数*/);

信号キャプチャ

  • (1)まず、ユーザは、通常、例外を処理するために直接カーネルモードに起因する割り込み、例外またはシステムコールに、メイン制御フローで行われます
  • (2)カーネルがユーザモードに戻る準備ができて異常処理され、現在のプロセスは、信号処理にハンドオーバするがあれば到達できない信号が存在しない参照することの前に、
  • (3)信号処理機能は、ユーザ定義実行するためにユーザ・モード・ユーザー定義の信号処理機能に復帰する場合
  • (4)信号処理機能を実行した後、システムは、カーネルモードに再び特定の関数呼び出しsigreturnを呼び出す、システム行うコール
  • (5)このシステムコールが完了した後、それがメインの制御フローに戻りますが中断場所で次のコードを実行し続け
  • (6)ときに実行のメイン制御フロー例外が再び発生した場合、割り込みまたはシステムコールは、以下の手順を続行し、(1)に戻り続けます

 

信頼性と信頼性の低い信号信号

リアルタイム信号は:信頼性の高い信号である
非リアルタイム信号の:信頼できない信号

信頼性のない信号

  • 1-31は、信号損失現象があるだろう、信頼性がありません
  • 以前のUnixの信号から継承されたLinuxの信号、Unixのの欠陥信号
  • 信号処理機能が終了すると、デフォルトモードに信号処理リセット(Linuxは改善しています)
  • 信号の損失があるでしょう、信号がラインアップされません

信頼性の高い信号

  • 信号は、34から64まで再設計を設定します
  • 信号が失われたサポートラインではありません、信号処理機能が終了し、処理モードをデフォルトに戻しません。

 

[]キル-l  あなたはそれが今の信号である信号のすべてを見ることができるコマンドが65に増えましたが、ここで私が言及したい、33-64これらの信号は、これを使用することから、一般的ではない信頼性の高い信号を区別することで、信頼性のない信号32の新しく追加された信号。

cll@cll-linux:~ $ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

[男7信号]  このためにコマンドが7ページ目では、マニュアルを参照するために男を使用するため、直接使用の男7。一般的な標準信号を次のように

Standard signals
       Linux  supports the standard signals listed below.  Several signal num‐
       bers are architecture-dependent, as indicated in  the  "Value"  column.
       (Where three values are given, the first one is usually valid for alpha
       and sparc, the middle one for x86, arm, and most  other  architectures,
       and  the  last one for mips.  (Values for parisc are not shown; see the
       Linux kernel source for signal numbering on that  architecture.)   A  -
       denotes that a signal is absent on the corresponding architecture.)

       First the signals described in the original POSIX.1-1990 standard.

       Signal     Value     Action   Comment
       ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process

       The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

       Next  the  signals  not  in  the POSIX.1-1990 standard but described in
 Manual page signal(7) line 134 (press h for help or q to quit)

上記信号において、

プログラムは、ブロックをキャプチャするか、信号を無視することはできません 9)SIGKILL、19)SIGSTOP
信号のデフォルトの動作に戻りませ 4)SEAL、5)SIGTRAP
デフォルトでは、プロセス信号の流産につながります 6)SIGABRT、7)SIGBUS、8)SIGFPE、4)シール、29)SIGIO、3)SIGQUIT、11)SIGSEGV、5)SIGTRAP、24)SIGXCPU、25)SIGXFSZ
デフォルトでは、出口に信号処理につながります 14)SIGALRM、1)SIGHUP、2)SIGINT、9)SIGKILL、13)SIGPIPE、イベントをポーリング可能デバイスに送信されるSIGPOLL(送り、システムの一部)、27)SIGPROF、31)SIGSYS、15)SIGTERM、 10)SIGUSR1,12)SIGUSR2,26)SIGVTALRM
デフォルトでは、停止する信号処理につながります 19)SIGSTOP、20)SIGTSTP、21)SIGTTIN、22)SIGTTOU
デフォルトのプロセスがシグナルを無視します 17)SIGCHLD、30)SIGPWR、23)シグルズ、28)SIGWINCH
  • また、SIGIOはSVR4出口で、4.3BSDでは無視されています。
  • SIGCONTは、それ以外の場合は無視され、ブロックすることができない、プロセスにハングアップし続けることです。

デフォルトの動作:

  •               期間:プロセスを終了
  •               IGN:信号を無視(デフォルト瞬間は、信号処理の種類を無視)
  •               コア:コア・ファイルを生成し、プロセスを終了します。(識別プロセスは、死のデバッグするためのGDBの原因となります)
  •               停止:停止(一時停止)プロセス
  •               続き:実行中のプロセスを続行します

 

キル、killallを、キル(pid_t pidを、int型SIG)。

キル、killallを

この2つのコマンドは、プロセスにシグナルを送信するために使用されています。killallをプロセス名を必要としながら、killコマンドは、引数としてプロセス番号が必要です。さらに、これらの二つのコマンドの後に、パラメータとして、送信信号数に加えてもよいです。デフォルトでは、それらが関連するプロセス信号15(TERM)に送信されます。あなたはPID 666でプロセスを終了したい場合は、次のコマンドを入力します。

kill 666

あなたはそれが9(SIGKILL)を信号送信する場合は、次のコマンドを入力します。

kill -9 666

あなたはコマンド名を終了するためのプロセスを知りたいとします。あなたは、その名前によってそれを終了することができますが、プロセスのプロセスIDを見つけるには、psを使用する必要はありません。

killall -9 your-process-name

 

キル(pid_t pidを、int型SIG)。

任意のプロセス・グループまたはプロセスに信号を送信します。

ヘッダファイルの使用法:

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

パラメータ:
PID:4つの可能なオプションがあります。

  • 1. pidがゼロより大きい場合、PID識別信号がプロセスに送信されます。
  • 信号が同じグループおよび使用プロセスの呼び出しが殺すこと()プロセスに属するすべてに送信される場合2. PIDがゼロに等しいです。
  • 3. pidが-1に等しく、信号は、プロセス1(INIT)に加えて、プロセスに呼び出しプロセスの全てに信号を送信する権利を送信します。
  • 4. pidが-1未満である場合、信号はIDが-pidのプロセス・グループに送信されます。

SIG:レディ信号送信されたコードは、その値には、信号が送信されない場合はゼロであるが、システムは、多くの場合、プロセスはまだ実行されているかどうかを確認するためにゼロのSIG値を使用し、エラーチェックを行います。

公開された170元の記事 ウォンの賞賛207 ビュー459万+

おすすめ

転載: blog.csdn.net/xiaoting451292510/article/details/103731042