Linux:简单信号编程记录
重要信号相关函数
信号发送函数
kill
可打断sleep函数,处理信号函数之后直接执行不再睡眠killpg
给进程组发信号,killpg(pid,sign)等价于kill(-pid,sign);raise
给自己发信号,等价于kill(getpid(),sign);sigqueue
给进程发信号,支持排队可附带信息
其他信号相关函数
pause
进程挂起,直到捕获到信号alarm
延迟一定时间后,发送SIGALRM信号
部分函数说明及补充
- int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
用于改变进程接收到特定信号后的行为 - int sigqueue(pid_t pid,int sig,const union sigval value);
在队列中向指定进程发送一个信号和数据(与kill
函数相似),与函数sigaction()配合使用
可重入与不可重入函数
- 满足以下条件的函数基本为不可重入函数
- 使用静态数据结构
- 使用
malloc
函数或者free
函数 - 使用
I/O
函数
信号掩码
- 说明
- 每个进程都有一个信号掩码(signal mask),也称为信号屏蔽字;
- 信号掩码规定了当前要屏蔽或要阻塞递送到该进程的信号集;
- 对于每种可能的信号,该掩码中都有一位与之对应;
- 对于某种信号,若其对应位(bit)已设置,则它当前是被阻塞的;
- 信号对应位为1,就表示在执行当前信号集的处理程序期间相应的信号暂时被“屏蔽”或“阻塞”,使得在执行的过程中不会嵌套地响应那个信号。
信号集
-
数据类型为
sigset_t
- int sigemptyset(sigset_t *set);
初始化信号集为empty - int sigfillset(sigset_t *set);
把所有信号加入到集合中并初始化 - int sigaddset(sigset_t *set,int signum);
将信号signum加入到set信号集 - int sigdelset(sigset_t *set,int signum);
将信号signum从信号集中删除 - int sigismember(const sigset_t *set,int signum);
查询signum是否在信号集 - int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);
用于改变进程的当前阻塞信号集,也可以用来检测当前进程的信号掩码。
- int sigemptyset(sigset_t *set);
-
sigprocmask
函数说明
- sigprocmask 可以用来检测或改变信号屏蔽字,其操作依参数how来决定
- 如果参数oldset是一个非空指针,信号屏蔽字会由此指针返回
- 如果set是一个非空指针,参数how指示如何修改当前信号屏蔽字
- 每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。
参数说明
- how:
- SIG_BLOCK
将newset所指向的信号集中所包含的信号加到当前的信号掩码中,作为新的信号屏蔽字。 - SIG_UNBLOCK
将参数newset所指向的信号集中的信号从当前的信号掩码中移除。 - SIG_SETMASK
设置当前信号掩码为参数newset所指向的信号集中所包含的信号。
- SIG_BLOCK