linux信号メカニズム

3034 ワード

1.Linuxでサポートされている信号のリストは以下の通りです.多くの信号は機械のアーキテクチャに関連している.
信号値デフォルト処理動作が信号を発する理由
SIGHUP 1 A端末の保留または制御プロセスの終了
SIGINT 2 Aキーボード割り込み(breakキーが押されるなど)
SIGQUIT 3 Cキーボードの終了キーが押されます
SIGILL 4 C不正命令
SIGABRT 6 C abort(3)からの脱退指令
SIGFPE 8 C浮動小数点異常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C無効なメモリリファレンス
SIGPIPE 13 Aパイプ破裂:リードポートのないパイプを書く
SIGALRM 14 A alarm(2)からの信号
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制御端末(tty)でストップキーを押す
SIGTTIN 21,21,26 Dバックグラウンドプロセスは制御端末から読もうとする
SIGTTOU 22,22,27 Dバックグラウンドプロセスは制御端末から書こうとする
2.信号セットの作成
sigset_t initset; sigemptyset(&initset);//初期化信号セットが空のセットsigaddset(&initset,SIGINT);//SIGINT信号をこのセットに加えてsigprocmask(SIG_BLOCK,&initset,NULL);//プロセスのブロックセットに信号セットを追加して失敗して-1を返します.
//    fd    
int create_signal_fd ( void )
{
    sigset_t attention_signal;
    sigemptyset ( &attention_signal );
    sigaddset ( &attention_signal,SIGPIPE );
    return sigprocmask ( SIG_BLOCK, &attention_signal,NULL ) < 0 ? -1 : signalfd ( -1,&attention_signal,SFD_CLOEXEC );
}

//  fd,             
signalfd_siginfo signal_buf;
if ( signal_buf.ssi_signo==SIGPIPE ) {
    LOG(INFO) <

3.簡単な信号処理関数signal()
#include void (signal(int signum, void (handler))(int)))(int);
この関数のプロトタイプが分かりにくい場合は、以下の分解方法を参考にして理解できます.
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler));
1番目のパラメータは信号の値を指定し、2番目のパラメータは前の信号の値に対する処理を指定し、この信号を無視することができる(パラメータはSIG_IGNとする).信号はシステムのデフォルト方式で処理することができる(パラメータはSIG_DFLとする).処理方式は自分で実現することもできます(パラメータは関数アドレスを指定します).
signal()呼び出しに成功した場合、最後に信号signumをインストールするためにsignal()を呼び出したときのhandler値を返します.失敗するとSIG_に戻るERR.
信号処理ルーチンに伝達される整数パラメータは信号値であり、1つの信号処理ルーチンが複数の信号を処理することができる.
#include 

#include 

#include 

void sigroutine(int dunno)

{ /*       ,  dunno         */

        switch (dunno) {

        case 1:

        printf("Get a signal -- SIGHUP ");

        break;

        case 2:

        printf("Get a signal -- SIGINT ");

        break;

        case 3:

        printf("Get a signal -- SIGQUIT ");

        break;

        }

        return;

}

 

int main() {

        printf("process id is %d ",getpid());

        signal(SIGHUP, sigroutine); //*              

        signal(SIGINT, sigroutine);

        signal(SIGQUIT, sigroutine);

        for (;;) ;

}

 

//    SIGINT   Ctrl-C  ,  SIGQUIT   Ctrl-  。          :

localhost:~$ ./sig_test

process id is 463

Get a signal -SIGINT //  Ctrl-C     

Get a signal -SIGQUIT //  Ctrl-     

//  Ctrl-z       

 [1]+ Stopped ./sig_test

localhost:~$ bg

 [1]+ ./sig_test &

localhost:~$ kill -HUP 463 //     SIGHUP  

localhost:~$ Get a signal – SIGHUP

kill -9 463 //     SIGKILL  ,    

localhost:~$