信号
- 其源于 UNIX 中的一种的古老方法,其是
在软件层次上对中断机制的一种模拟(软中断)
,是一种异步通信
方式。可以直接进行用户空间进程(user process)
和内核进程(kernel process)
之间的交互,内核进程
也可以利用其来通知用户空间进程(user process)
发生了哪些系统事件。如果该进程(Process
)当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程
。
- 信号类型简介 :
- 最初之时,UNIX 系统只有1-31总共31个信号,这些信号每个都有特殊的含义和特定的用法。其特点是用bit flag实现的。此会导致当一个信号还在待决的时候,又来了一个同样的信号,再次设置bit位是没有意义的,因此就会丢失一次信号。为了解决该问题,后来 POSIX 规定增加32-64这33个信号作为实时信号,并规定实时信号不能丢失,要用队列来实现。把之前的信号
1-31叫做标准信号
,由于标准信号会丢失,因此也称做不可靠信号
,由于标准信号是用bit flag实现的,所以标准信号也叫做标记信号(flag signal)
。由于实时信号不会丢失,所以也叫作可靠信号
,由于实时信号是用队列实现的,因此也称做排队信号(queue signal)
。如平常遇到的SIGSEGV、SIGABRT
等信都是标准信号。
- 最初之时,UNIX 系统只有1-31总共31个信号,这些信号每个都有特殊的含义和特定的用法。其特点是用bit flag实现的。此会导致当一个信号还在待决的时候,又来了一个同样的信号,再次设置bit位是没有意义的,因此就会丢失一次信号。为了解决该问题,后来 POSIX 规定增加32-64这33个信号作为实时信号,并规定实时信号不能丢失,要用队列来实现。把之前的信号
- 用户进程响应信号的3种方式:
- 忽略信号:
即对信号不做任何处理,但是有两个信号不能忽略,即 SIGKILL 及 SIGSTOP。
- 捕捉信号:
定义信号处理函数,当信号发生时,执行相应的自定义处理函数。
- 缺省操作:
系统对每种信号都规定了默认操作,当发生了该信号,系统会自动执行。
- 忽略信号:
- 函数说明:
kill()
函数既可以中止进程(实际上发出SIGKILL
信号),亦可以向进程发送其它信号。raise()
函数允许进程向自己发送信号。alarm(
)函数亦称闹钟函数,其在进程中设置一个定时器,当指定时间到,就向进程发送SIGALARM
信号。- 注:一个进程只能设置一个闹钟时间,若设置多个,其值会被最新设置的覆盖代替。
pause()
函数是将调用的进程挂起直到捕捉信号为止。
- 信号处理:
- 两种处理方法:
singal()函数(还有一个更健壮、新的函数sigaction())
和信号集函数组
。- 使用
signal()
函数时,只需要指出要处理的信号
和处理函数
即可,其主要是用于前32种非实时信号
的处理,不支持信号传递信息。 - 信号集函数组调用顺序功能模块:
创建信号集合
、注册信号处理函数
以及检测信号
。- 创建信号集合:
sigemptyset()
:将信号集合初始化为空
。sigfillset()
:将信号集合初始化为包含所有已定义的信号的集合
。sigaddset()
:将指定信号加入到信号集合中去
。sigdelset()
:将指定信号从信号集合中删除
。sigismember()
:查询指定信号是否在信号集合之中
。
- 创建信号集合:
- 使用
- 注:
信号集里的信号并不是真正可以处理的信号
,只有当信号的状态处于非阻塞状态
时才会真正起作用。
- 两种处理方法:
- 参考文献:《Linux嵌入式应用程序开发标准教程》
- 参考资料: https://zhuanlan.zhihu.com/p/537431439