原文链接:http://blog.csdn.net/lyh__521/article/details/49646927
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间唯一的异步通信方式。
信号来源
- 硬件方式
- 用户在终端按下某些键。如 Ctrl+C
- 硬件异常。如:除数为0、无效的存储访问等。这些事件由CPU检测到,然后通知给内核,由内核生成相应的信号,并把信号发送给正在运行的程序。
- 软件方式
- 用户在终端调用kill命令。
- 进程调用kill或sigqueue函数发送信号。
- 当检测到某种软件条件已经具备时发送信号。如设置的定时器超时。
信号种类
执行kill -l 命令可显示Linux系统所支持的全部信号
信号的值在signal.h 中定义,以下时部分信号的含义,具体可查询《UNIX环境高级编程》
注:默认动作是,当用户没有专门为该信号定义相应的处理函数时,进程收到该信号默认产生的行为。
(1) SIGINT : 用户按下了Ctrl+C 组合键。默认为终止进程。
(2) SIGILL:CPU检测到某进程执行了非法指令。默认终止进程并产生core文件。
(3) SIGABRT:调用abort函数时产生的信号。默认终止进程并产生core文件。
(4) SIGBUS:非法访问内存地址,包括内存地址对齐出错,默认终止进程并产生core文件。
(5) SIGFPE:发生致命的算术运算错误,如浮点运算错误,溢出以及除数为0等。默认终止进程并产生core文件。
(6) SIGKILL:无条件终止进程。本信号不能被忽略、处理和阻塞。使用他可以杀死任何进程。默认终止进程。
(7) SIGSEGV:进程进行了无效的内存访问。默认动作为终止进程并产生core文件。
(8) SIGALRM:定时器超时,由系统调用alarm设置。默认终止进程。
(9) SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和处理。通常用来要求程序正常退出。执行kill命令缺省产生该信号。默认终止进程。
(10) SIGCHLD:子进程结束时,父进程会收到这个信号。默认忽略该信号。
(11) SIGCONT:让一个暂停的进程继续执行。
(12) SIGSTOP:停止进程的执行。注意他和SIGTERM以及SIGINT的区别:该进程还未结束,只是暂停执行。本信号不能为忽略、处理和阻塞。默认暂停进程。
(13) SIGTSTP:停止进程的运行,但该信号可以被处理和忽略。按下Ctrl+Z时发出。默认暂停进程。
(14) SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出此信号,报告有紧急数据到达。默认忽略该信号。
(15) SIGXCPU:进程执行时间超过了分配给该进程的CPU时间。默认动作为终止进程。
(16) SIGIO:此信号向进程指示发生了一个异步IO事件。默认忽略。
(17) SIGPWR:关机。默认终止进程。
(18) SIGUSR1和SIGUSR2 是用户自定义信号。默认为终止进程。
(00) SIGHUP 至 SIGSYS 的信号都是继承自UNIX系统,是不可靠信号。SIGRTMIN至SIGRTMAX之间的信号,他们都是可靠信号,也称为实时信号。
可靠信号与不可靠信号
信号的可靠性是指信号是否会丢失,或者说信号是否支持排队。
进程可以将信号设置为阻塞,如果进程产生了一个阻塞的信号,并且不希望忽略该信号,则内核会将该信号保持为未决状态,直到该进程对该信号解除阻塞或更改为忽略。在这之间,如果信号发生了多次,那么如果信号被递送多次,则称之为可靠信号;只被递送一次的信号称为不可靠信号。
信号的优先级
信号实质上是软中断,中断有优先级,信号也有优先级。如果一个进程有多个未决信号,则对于同一个未决的实时信号,内核将按照发送的顺序来递送信号。如果存在多个未决的实时信号,则值(或者说说编号)越小的越先被递送。如果既存在不可靠信号,又存在可靠信号(实时信号),大多数遵循POSIX标准的操作系统将优先递送不可靠信号。
进程对信号的响应
- 捕捉信号。指定信号处理函数。
- 忽略信号。
- 按照系统默认方式处理。