Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxについて >> Linuxシグナルメカニズム解析

Linuxシグナルメカニズム解析

  

Linuxでは、ソフト割り込みとも呼ばれ、シグナルを受信した後にシグナルを処理することから、割り込みプロセスと言えるでしょう。この記事では、Linuxのシグナル伝達メカニズムについて簡単に説明します。
ログイン

1、信号処理機能は、

システム・プログラミング・レベルで最も直接的にプロセス信号との間の関係に関連し、2つの機能を有する
インストールされ、それらは信号処理機能をインストールするために使用されます。< Br>

sighandler_tシグナル(int signum、sighandler_tハンドラー);

int sigaction(intシグナル、const sigaction * act ,, struct sigaction * oldact);

最初の関数Signalは比較的単純で、sighandler_tは別名で、そのプロトタイプはtypedef void(* sighandler_t)(int)です。これは関数ポインタで、int(signal number)型のパラメータを受け入れ、voidを返します。たとえば、SIGUSR1シグナルを処理するには、次のようにします。

void handler(int sig)
<<> <

//strsiganl関数は、シグナルの番号をシグナルの説明の文字列に変換します。 Br>

printf(シグナルの受信:%s、strsignal(sig));

}

int main()

{

signal(SIGUSR1、handler);

while(1)

;

}

(このプログラムは実際には問題があります、後で見るように、このプログラムはもともと無限ループですが、SIGUSR1シグナルを彼に送信すると、プログラムはしばらくの間「割り込み」の中に入り、ハンドラーでコードを実行します。シェルで、killコマンドを使用してシグナルSIGUSR1を送信すると、プログラムは次のような情報を約束します。 signal()の使い方はそれとほとんど同じくらい簡単です。ただし、移植性の理由から、プロジェクト開発に参加するときは次の機能を使用する必要があります。

sigaction()関数のパラメータには2つの構造体があり、manページのプロトタイプは次のとおりです。

struct sigaction {

void(* sa_handler)(int); Br>

void(* sa_sigaction)(int、siginfo_t *、void *);

sigset_t sa_mask;

int sa_flags;

void(* sa_restorer)( Void);

};

私の知る限り、sa_handlerとsa_sigactionは実際には和集合になっています。これらはシグナルハンドラへのポインタです。

sa_maskはマスクされるシグナルであり、sa_flagsにはいくつかのオプションがあります。 (これら2つの点についての詳細は後で)。 sigaction()プロトタイプから、パラメータに2つのstruct sigactionパラメータがあることがわかります。ここで、actはインストールされる信号処理であり、oldactは信号処理後に元の処理方法を戻すために使用されます。前の信号処理方法を取り戻す必要がない場合は3番目のパラメータをNULLに設定し、新しい信号処理をインストールする代わりに前の処理方法だけを取得する場合は2番目のパラメータをNULLに設定できます。 Signal()は利用できません。上記の例をsigaction()で書き換えると、次のようになります。

1 void handler(int sig)

2 {

3 printf('シグナルの受信:%s&');、strsignal(sig));

4}

5

6 int main()

7 {

8 struct Sigaction act;

9 sigemptyset(& act.sa_mask);

10 act.sa_handler = handler;

11 act.sa_flags = 0;

12 sigaction(SIGUSR1、& act、NULL);

13 while(1)

14;

15}前12次合計2ページ

Copyright © Windowsの知識 All Rights Reserved