部分概念摘录自《UNIX环境高级编程》
信号是软件中断
。
信号提供了一种处理异步事件的方法。
每个信号都有一个名字,都以3个字符SIG开头。
实际上,实现将各信号定义在另一个头文件中,但是该头文件又包括在<signal.h>中。Linux 将信号定义在<bits/signum.h>。
不存在编号为 0 的信号。
kill 函数对信号编号 0 有特殊的应用。POSIX.1将此种信号编号值称为空信号。
Linux查看支持的信号:
$ 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
硬件、软件、用户、错误、收发到数据、、、等等各种场景都可能产生信号。
在某个信号出现时,有三种处理方式。
(1)忽略此信号。大多数信号都可使用这种方式进行处理,但有两种信号却决不能被忽略。它们是SIGKILL和SIGSTOP。
(2)捕捉信号。内核在信号发生时,调用一个用户函数对这种事件进行的处理。。注意,不能捕捉SIGKILL和SIGSTOP信号。
注:
可以为各种错误、异常等信号编写处理函数。
(3)执行系统默认动作。注意,对大多数默认动作是终止该进程。
UNIX系统信号机制最简单的接口是signal函数。
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int);
signal函数由ISO C定义。因为ISO C不涉及多进程、进程组以及终端I/O等,所以它对信号的定义非常含糊,以致于对UNIX系统而言几乎毫无用处。
因为signal的语义与实现有关,所以最好使用sigaction函数代替signal函数。
signo参数是信号名。
func参数:
1、SIG_IGN 忽略信号(SIGKILL和SIGSTOP不能忽略)
2、SIG_DFL 系统默认动作
3、用户函数的地址 执行信号处理程序。
注意,在UNIX系统中,kill命令和 kill函数只是将一个信号发送给一个进程或进程组。该信号是否终止进程则取决于该信号的类型,以及进程是否安排了捕捉该信号。
简单实现:
#include<signal.h>
#include<iostream>
using namespace std;
static void sig_func(int signo){
cout<<"signal number is:"<<signo<<endl;
}
int main(int argc, char const *argv[])
{
signal(SIGUSR1,sig_func);
while (1)
{
/* code */
}
return 0;
}
sh下:
指令 :
kill -USR1 1926
返回:
signal number is:10