信号的概述
信号是软件中断,它是在软件层次上对中断机制的一种模拟。
信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。信号是一种异步通信方式。
进程不必等待信号的到达,进程也不知道信号什么时候到达。
信号可以直接进行用户进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件。
每个信号的名字都以字符SIG开头。
每个信号和一个数字编码相对应,在头文件signum.h中 ,这些信号都被定义为正整数。
信号名定义路径:
/user/include/i386-linux-gnu/bits/signum.h(ubuntu12.04)
在Linux下,要想查看这些信号和编码的对应关系,可使用命令:kill -l
产生信号的方式
1.当用户按某些终端键时,将产生信号
例如:
终端上按“Ctrl+c” 组合键通常产生中断信号SIGINT、
终端上按“Ctrl+\” 键通常产生中断信号SIGQUIT、
终端上按“Ctrl+z”键通常产生中断信号SIGTOP。
2.硬件异常将产生信号
除数为0,无效的内存访问等。
3.软件异常将产生信号
当检测到某种软件条件已发生,并将其通知有关进程时,产生信号。
4.调用kill函数将发送信号
注意:接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。
5.运行kill命令将发送信号
此程序实际上是使用kill函数来发送信号。也常用此命令终止一个失控的后台进程。
信号的默认(缺省)处理方式
当进程中产生了一个信号,就会让当前进程做出一定的反应,
默认处理进程的方式如下:
1、终止进程: 当信号产生时,当前进程就会立即结束
2、缺省进程: 当信号产生时,当前进程不作任何处理
3、停止进程: 当信号产生时,使得当前进程停止
4、让停止的进程恢复运行: 当信号产生后,停止的进程会恢复执行(后台进程)
**注意:**每一个信号只有一个默认的处理方式
进程接收到信号后的处理方式
1、执行系统默认动作
对大多数信号来说,系统默认动作是用来终止进程。
2、忽略此信号
接受此信号后没有任何动作
3、执行自定义信号处理函数
用用户定义的信号处理函数处理该信号。
注意: SIGKILL和SIGSTOP这两个信号只能以默认的处理方式执行,不能忽略也不能自定义
常见的信号
信号 | 值 | 性质 | 默认处理方式 |
---|---|---|---|
SIGKILL | 9 | 当产生这个信号后,当前进程会退出,不能被缺省或捕捉 | 退出进程 |
SIGSTOP | 19 | 当产生这个信号后,当前进程会停止,不能被缺省或捕捉 | 停止进程 |
SIGINT | 2 | 键盘输入Ctrl+c时产生的信号 | 退出进程 |
SIGQUIT | 3 | 键盘输入Ctrl+\时产生的信号 | 退出进程 |
SIGTSTP | 20 | 键盘输入Ctrl+z时产生的信号 | 停止进程 |
SIGCONT | 18 | 当产生当前信号后,当前停止的进程会恢复运行 | 停止的进程恢复运行 |
SIGALRM | 14 | 当调用alarm函数设置的时间到达时会产生当前信号 | 退出进程 |
SIGPIPE | 13 | 当管道破裂是,会产生当前信号 | 退出进程 |
SIGABRT | 6 | 当调用abort函数时,会产生当前信号 | 退出进程 |
SIGCHLD | 17 | 当使用fork创建一个子进程时,如果子进程状态改变(退出),会产生当前信号 | 缺省 |
SIGUSR1 | 10 | 用户自定义信号,不会自动产生,只能使用kill函数或者命令给指定的进程发送当前信号 | 缺省 |
SIGUSR2 | 12 | 用户自定义信号,不会自动产生,只能使用kill函数或者命令给指定的进程发送当前信号 | 缺省 |