Linuxの信号
11857 ワード
Linuxの信号
1.信号紹介
2.信号の発生と処理
2.1信号の発生
2.2信号の処理
3.一般的な信号タイプと動作
完全な信号タイプは/usr/include/x 86_64-linux-gnu/bitsディレクトリのsignum.hファイルで表示します.
/* Signals. */
#define SIGHUP 1 /* Hangup (POSIX). */
#define SIGINT 2 /* Interrupt (ANSI). */
#define SIGQUIT 3 /* Quit (POSIX). */
#define SIGILL 4 /* Illegal instruction (ANSI). */
#define SIGTRAP 5 /* Trace trap (POSIX). */
#define SIGABRT 6 /* Abort (ANSI). */
#define SIGIOT 6 /* IOT trap (4.2 BSD). */
#define SIGBUS 7 /* BUS error (4.2 BSD). */
#define SIGFPE 8 /* Floating-point exception (ANSI). */
#define SIGKILL 9 /* Kill, unblockable (POSIX). */
#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
#define SIGSEGV 11 /* Segmentation violation (ANSI). */
#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
#define SIGPIPE 13 /* Broken pipe (POSIX). */
#define SIGALRM 14 /* Alarm clock (POSIX). */
#define SIGTERM 15 /* Termination (ANSI). */
#define SIGSTKFLT 16 /* Stack fault. */
#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
#define SIGCHLD 17 /* Child status has changed (POSIX). */
#define SIGCONT 18 /* Continue (POSIX). */
#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
#define SIGTSTP 20 /* Keyboard stop (POSIX). */
#define SIGTTIN 21 /* Background read from tty (POSIX). */
#define SIGTTOU 22 /* Background write to tty (POSIX). */
#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
#define SIGPOLL SIGIO /* Pollable event occurred (System V). */
#define SIGIO 29 /* I/O now possible (4.2 BSD). */
#define SIGPWR 30 /* Power failure restart (System V). */
#define SIGSYS 31 /* Bad system call. */
#define SIGUNUSED 31
#define _NSIG 65 /* Biggest signal number + 1
(including real-time signals). */
一般的な信号をいくつかまとめます.
シグナルタイプ
しんごうち
しんごうきょどう
SIGINT
2
Ctrl+Cの場合、OSはフロントプロセスグループの各プロセスに送信されます.
SIGABRT
6
abort関数を呼び出し、プロセスが異常に終了します.
SIGIO/SIGPOLL
8
SIGIOは非同期IOイベントを示し、SIGPLOOはsystemvから派生し、SIGIOと同義である.
SKILL
9
プロセスを殺す究極の方法
SIGSEGV
11
メモリリファレンスが無効な場合はOSから送信されます
SIGPIPE
13
パイプとソケットに関する
SIGALARM
14
alarm関数の実装に関する
SIGTERM
15
killコマンドが送信するOSデフォルト終了信号
SIGCHLD
17
サブプロセスが終了すると、OSは親プロセスにこの信号を送信します.
SIGUSR1
10
ユーザカスタム信号
SIGUSR2
12
ユーザカスタム信号
4.信号処理システム呼び出し
4.1 signal()関数
#include
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
signal()関数は、現在のプロセスのある信号に対する処理方法を登録し、パラメータsignumは受信された信号タイプであり、パラメータhandlerは関数ポインタであり、信号処理方法関数である.Signalの戻り値はエラー時にSIG_ERR,バインド成功時に古いキャプチャ関数を返す.singnal()はunixとlinuxの異なるバージョンでは表現挙動が異なる可能性があるので、この関数を避けてsigaction()で代用することができます.Sigaction()はsignal()よりも移植性がある.
4.2 signal()関数
#include
int sigaction(int signum,
const struct sigaction *act,
struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Sigactionは、新しいキャプチャ関数の設定と古いキャプチャ関数の取得を一度に行うことができます(実際には、新しいキャプチャを個別に設定したり、古いキャプチャ関数のみを個別に取得したりすることもできます).signal関数は、古いキャプチャ関数を個別に取得するのではなく、新しいキャプチャ関数を設定したときに古いキャプチャ関数を取得する必要があります.