linux信号

不可忽略或捕获的信号SIGSTOP和SIGKILL

一般的信号可以使用signal函数忽略或捕获做进一步处理,而SIGSTOP和SIGKILL信号不可捕获,自然也没有办法忽略了.

在命令行使用kill -l命令可以列出所有linux信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[CaseZheng@VM_187_252_centos example]$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

Linux信号的捕获

signal

1
2
3
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

signum信号值
handler信号处理函数,有两个特殊值

  1. SIG_IGN屏蔽该函数
  2. SIG_DFL恢复默认行为
    返回值为之前的信号处理函数

sigaction

1
2
3
4
5
6
7
8
9
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int); //信号处理函数
void (*sa_sigaction)(int, siginfo_t *, void *); //信号处理函数 第二个参数可指向一个siginfo_t结构体
sigset_t sa_mask; //屏蔽信号集
int sa_flags; //
void (*sa_restorer)(void); //
};

用于改变进程接收到特定信号后的行为
signum信号值
act指向sigaction的一个实例指针,在sigaction中制定了对特定信号的处理方式,为空表示使用默认方式对信号进行处理
oldact保存原来对信号的处理方式,可以为NULL
成功返回0,失败返回-1