信号的认识
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用 kill 发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。
信号的种类
查看 linux 系统信号:
使用 kill 命令:
kill 命令功能并不是杀死进程,而是向进程发送信号,当进程接收到信号后,会执行系统默认的操作,而大多数的 操作都会使程序退出。
kill -l
信号分为可靠信号与不可靠信号,可靠信号又称为实时信号,不可靠信号又称为非实时信号。
可靠信号:
信号代码从SIGRTMIN到SIGRTMAX之间的信号是可靠信号,可靠信号支持排队不存在丢失。
非可靠信号:
信号值小于 SIGRTMIN 的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是信号可能丢失(进程收到的信号不作排队处理,相同的信号多次到来会合并为一个)。
信号的生命周期
信号产生->信号注册->信号在进程中注销->信号处理函数执行完毕
信号产生
信号的产生是指触发信号的事件发生,它的来源有:
1.程序错误,如非法访问内存
2.外部信号,如按下CTRL+C
3.通过kill或sigqeue向另外一个进程发送信号
kill函数:
向指定进程发送信号
sigqueu函数:
向指定进程发送信号,可携带一个参数
示例:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int pid;
union sigval val;
val.sival_int = 1;
pid = getpid();
kill(pid, SIGINT);
sigqueue(pid, SIGINT, val);
while (1){
sleep(1);
}
return 0;
}
信号注册
可靠信号注册机制:
内核每收到一个可靠信号都会去注册这个信号,在信号的未决信号链中分配 sigqueue 结构,因此,不会存在信号丢失的问题。
不可靠信号注册机制:
对于不可靠的信号,如果内核已经注册了这个信号,那么便不会再去注册,对于进程来说,便不会知道本次信号的发生。不可靠信号只注册一次,只有一个sigqueue 结构。
信号在进程中注销
在进程的执行过程中,每次从系统调用或中断返回用户空间的时候,都会检查是否有信号没有被处理。如果这些信号没有被阻塞,那么就调用相应的信号处理函数来处理这些信号。则调用信号处理函数之前,进程会把信号在未决信号链中的 sigqueue 结构卸掉。是否从未决信号集中把信号删除掉。
信号处理
信号响应的方式:
1.采用系统默认处理 SIG_DFL,执行缺省操作
2.捕捉信号处理,即用户自定义的信号处理函数来处理
3.忽略信号 SIG_IGN ,但有两种信号不能被忽略 SIGKILL,SIGSTOP