Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのシグナルメカニズム詳細な説明

Linuxのシグナルメカニズム詳細な説明

  

linuxのシグナルメカニズムは想像よりもはるかに複雑です。この記事では最短スペースを使ってメカニズムの詳細な分析を進めます。

1.シグナルとシグナルソース

シグナルの本質

シグナルはソフトウェアレベルでの割り込みメカニズムのシミュレーションであり、原則としてプロセスはシグナルを受け取ります。プロセッサから割り込み要求を受けるのと同じです。シグナルは非同期であり、プロセスはシグナルが到着するのを待つ必要はありません。

シグナルはプロセス間通信メカニズムの中で唯一の非同期通信メカニズムであり、何かが起こったことをシグナルを受信するプロセスに通知する非同期通知と見なすことができます。シグナルメカニズムは、POSIXによってリアルタイムで拡張された後により強力になり、基本的な通知機能に加えて、追加の情報を送信することができます。

シグナルソース

シグナルイベントは2つのソースで発生します:ハードウェアソース(キーボードを押したときなどのハードウェア障害など);ソフトウェアソース、シグナルを送信するために最も一般的に使用されるシステム関数はkillです。 、レイズ、アラーム、セッティマー、シグキュー機能、ソフトウェアソースにもいくつかの違法な操作が含まれています。

2番目に、信号の種類

2つの異なる分類角度から信号を分類することができます。(1)信頼性:信頼性の高い信号と信頼性の低い信号(?)と時間の関係上:リアルタイム信号と非リアルタイム信号このシステムでサポートされているすべてのシグナルは、「Linux環境におけるプロセス間通信(1):パイプと名前付きパイプ」の付録1にリストされています。

1、信頼できるシグナルと信頼できないシグナル

「信頼できないシグナル」

Linuxのシグナル伝達メカニズムは、基本的にUnixシステムから継承されています。初期のUnixシステムにおける信号メカニズムは比較的単純で原始的であり、後で実際にいくつかの問題を露呈したので、初期のメカニズムで確立された信号は「信頼できない信号」と呼ばれ、信号値はSIGRTMIN(Red Hat 7.2)より小さかった。 SIGRTMIN = 32、SIGRTMAX = 63の信号はすべて信頼性の低い信号です。これが「信頼できない信号」の原因です。その主な問題は以下のとおりです。

シグナルを処理した後、プロセスはシグナルに対するレスポンスをデフォルトのアクションに設定します。場合によっては、これによってシグナルのエラー処理が発生するため、ユーザーがそのような操作を望まない場合は、signal()がシグナルハンドラーの最後で再度呼び出されてシグナルが再インストールされます。

後で詳しく説明するように、信号が失われる可能性があります。

したがって、初期のUnixにおける信頼できないシグナルは、主にプロセスがシグナルに誤って応答し、シグナルが失われる可能性があるという事実を意味しています。

Linuxは信頼できないシグナルをサポートしますが、信頼できないシグナルメカニズムを改善します。シグナル処理関数を呼び出した後、シグナルのインストール関数を呼び出す必要はありません(シグナルインストール関数は信頼できるメカニズムで実装されています) 。したがって、Linuxでの信頼性の低い信号の問題は、主に信号が失われる可能性があることを意味します。

「信頼できるシグナル」

時間が経つにつれて、実際のシグナルのメカニズムを改善し拡張することが必要であることが実際に証明されています。したがって、「信頼できる信号」を達成するために、後で登場する様々なUnixバージョンがこの点に関して研究されてきた。元の定義済み信号には多くの用途があるため、変更するのは簡単ではありません最後に、いくつかの新しい信号が追加され、最初は信頼できる信号として定義されています。同時に、新しいバージョンのシグナルが送信され、インストールされます。シグナル送信関数sigqueue()とシグナルインストール関数sigaction()です。 POSIX.4は信頼できるシグナリングメカニズムを標準化しています。しかしながら、POSIXは信頼できるシグナルメカニズムとシグナルメカニズムの外部インターフェースの機能を標準化するだけで、シグナルメカニズムの実装を指定しません。

SIGRTMINとSIGRTMAXの間のシグナル値は信頼できるシグナルであり、信頼できるシグナルは起こりうるシグナル損失の問題を解決します。新しいバージョンのシグナルインストール関数sigation()とシグナル送信関数sigqueue()をサポートしていますが、Linuxはまだearly signal()シグナルインストール関数とシグナル送信関数kill()をサポートしています。

注意:そのような誤解をしないでください。sigqueue()とsigactionによって送信されたシグナルは信頼できるものです。実際、信頼できる信号は後で追加される新しい信号であり(信号値はSIGRTMINとSIGRTMAXの間にあります)、信頼できない信号はSIGRTMINよりも小さい信号値を持つ信号です。信号の信頼性と信頼性は信号値にのみ関連しており、信号伝送および設置機能とは無関係です。現時点では、linuxのsignal()はsigation()関数で実装されているため、signal()でシグナルをインストールしても、シグナル処理関数の最後でシグナルインストール関数を呼び出す必要はありません。同時に、signal()によってインストールされたリアルタイムシグナルはキューイングをサポートし、失われることはありません。

現在の2つのLinuxシグナルインストール関数、signal()とsigaction()では、SIGRTMINの以前のシグナルを信頼できるシグナルに変換することはできません(キューのサポートなし、失う可能性、まだ可能性があります)それは信頼できないシグナルです、そしてそれはSIGRTMINの後のシグナルのための待ち行列をサポートします。これら2つの機能の最大の違いは、sigactionによってインストールされたシグナルはシグナル処理機能に情報を渡すことができることです(すべてのシグナルに当てはまります)。一方、signalによってインストールされたシグナルは情報をシグナル処理機能に渡すことができません。シグナリング機能についても同じことが言えます。

2、リアルタイムシグナルと非リアルタイムシグナル

初期のUnixシステムでは32種類のシグナルしか定義されていませんでしたRet。7.2は64種類のシグナルをサポートしています、番号0-63(SIGRTMIN = 31、SIGRTMAX = 63)は将来さらに増加する可能性があり、これはカーネルによってサポートされる必要があります。最初の32個の信号はすでに定義済みの値を持ち、各信号は定義された目的と意味を持ち、そして各信号はそれ自身のデフォルト動作を持ちます。キーボードのCTRL ^ Cを押すと、SIGINTシグナルが生成されますこのシグナルに対するデフォルトの応答はプロセスの終了です。最後の32個の信号は、上述の信頼性のある信号と同等のリアルタイム信号を表す。これにより、送信された複数のリアルタイム信号が確実に受信されます。リアルタイムシグナルはPOSIX規格の一部であり、アプリケーションプロセスで使用できます。

非リアルタイム信号はキューをサポートしておらず信頼性の低い信号です;リアルタイム信号はキューをサポートしており信頼性の高い信号です。

3、シグナルに対するプロセスの応答

プロセスは、3つの方法でシグナルに応答することができます。(1)シグナルを無視します。つまり、2つのシグナルがあるシグナルに対して処理を行いません。無視できない:SIGKILLとSIGSTOP;(2)シグナルをキャプチャする。シグナル処理機能を定義し、シグナルが発生したら、対応する処理機能を実行します;(3)デフォルト操作を実行し、Linuxは各シグナルのデフォルト操作を指定します、詳細については[2]およびその他の資料を参照してください。リアルタイムシグナルに対するプロセスのデフォルトの応答はプロセスの終了です。

対応するAPI関数に渡されるパラメータに応じて、どのLinuxがシグナルに応答するために上記の3つの方法を使用します。

4番目のシグナル送信

シグナルの主な機能は、kill()、raise()、sigqueue()、alarm()、setitimer()、そしてabort()です。

1、kill()

#include< sys /types.h>

#include< signal.h>

int kill() Pid_t pid、int signo)

パラメータpid value signalの受信プロセス

pid> 0プロセスIDがpidのプロセス

pid = 0同じプロセスグループのプロセス

pid< 0 pid!= - 1プロセスグループIDを持つすべてのプロセス-pid

pid = -1送信プロセス自体を除く、プロセスIDが1より大きいすべてのプロセス

Sinnoはシグナルの値で、0(つまりnullシグナル)の場合は実際にシグナルは送信されませんが、通常どおりエラーチェックが実行されるため、対象プロセスが存在するかどうか、および現在プロセスにシグナルを送信する権限があるかどうかを確認できます(root特権プロセスはどのプロセスにもシグナルを送信できます。root特権以外のプロセスは同じセッションまたは同じユーザーに属するプロセスにのみシグナルを送信できます)。

Copyright © Windowsの知識 All Rights Reserved