天天看点

【Linux系统编程】信号 (下)

00. 目录

01. 信号集

02. 信号阻塞集

03. sigaction函数

04. 附录

为了方便对多个信号进行处理,一个用户进程常常需要对多个信号做出处理,在 Linux 系统中引入了信号集(信号的集合)。这个信号集有点类似于我们的 QQ 群,一个个的信号相当于 QQ 群里的一个个好友。

信号集是用来表示多个信号的数据类型(sigset_t)。

信号集相关的操作主要有如下几个函数:

测试代码:

测试结果

信号阻塞集(屏蔽集、掩码)

信号阻塞集也称信号屏蔽集、信号掩码。**每个进程都有一个阻塞集,创建子进程时子进程将继承父进程的阻塞集。**信号阻塞集用来描述哪些信号递送到该进程的时候被阻塞(在信号发生时记住它,直到进程准备好时再将信号通知进程)。

所谓阻塞并不是禁止传送信号, 而是暂缓信号的传送。若将被阻塞的信号从信号阻塞集中删除,且对应的信号在被阻塞时发生了,进程将会收到相应的信号。

我们可以通过 sigprocmask() 修改当前的信号掩码来改变信号的阻塞情况。

注意:不能阻塞 SIGKILL 和 SIGSTOP 等信号,但是当 set 参数包含这些信号时 sigprocmask() 不返回错误,只是忽略它们。另外,阻塞 SIGFPE 这样的信号可能导致不可挽回的结果,因为这些信号是由程序错误产生的,忽略它们只能导致程序无法执行而被终止。

测试结果:

从 UNIX 系统继承过来的信号(SIGHUP~SIGSYS,前 32 个)都是不可靠信号,不支持排队(多次发送相同的信号, 进程可能只能收到一次,可能会丢失)。

SIGRTMIN 至 SIGRTMAX 的信号支持排队(发多少次, 就可以收到多少次, 不会丢失),故称为可靠信号。

可靠信号就是实时信号,非可靠信号就是非实时信号。

signal() 函数只能提供简单的信号安装操作,使用 signal() 函数处理信号比较简单,只要把要处理的信号和处理函数列出即可。

signal() 函数主要用于前面 32 种不可靠、非实时信号的处理,并且不支持信号传递信息。

Linux 提供了功能更强大的 sigaction() 函数,此函数可以用来检查和更改信号处理操作,可以支持可靠、实时信号的处理,并且支持信号传递信息。

下面我们一起学习其相关函数的使用。

sigqueue函数

sigaction函数

struct sigaction 结构体

信号处理函数

测试程序: 一个进程在发送信号,一个进程在接收信号的发送。

发送信号测试代码:

接收信号测试代码:

两个终端分别编译代码,一个进程接收,一个进程发送,运行结果如下:

【Linux系统编程】信号 (下)

4.1 参考博客: 【linux系统编程】进程间通信:信号中断处理

继续阅读