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を返します.
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つの信号処理ルーチンが複数の信号を処理することができる.
信号値デフォルト処理動作が信号を発する理由
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:~$