本节主要介绍使用sigprocmask函数来人工设置信号阻塞。首先介绍函数原型:
/* Get and/or change the set of blocked signals. */
extern int sigprocmask (int __how, __const sigset_t *__restrict __set,
sigset_t *__restrict __oset) __THROW;
1)函数参数说明:
__how: 输入参数,设置信号阻塞掩码的方式。可以包括3中掩码设置,分别是阻塞信号的SIG_BLOCK,接触阻塞的SIG_UNBLOCK, 设置阻塞掩码的SIG_SETMASK。
__set: 输入参数,阻塞信号集。当参数__how为SIG_BLOCK时,该参数标明要阻塞的信号集。当__how参数为SIG_UNBLOCK时,该参数解除阻塞的信号集。当__how参数为SIG_SETMASK时,该参数标明要阻塞的信号集。
__oset: 输出参数,原阻塞信号集。调用成功后,将返回该进程原阻塞信号集。
2)返回值说明:
0: 调用成功;
-1: 调用失败,可以通过errno获取详细信息。
示例:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
void
handle_sigint(int signo)
{
printf("receive signal %d\n", signo);
}
int
main(void)
{
sigset_t mask;
sigset_t omask;
signal(SIGINT, handle_sigint);
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigprocmask(SIG_BLOCK, &mask, &omask);
sleep(10);
sigprocmask(SIG_SETMASK, &omask, NULL);
exit(0);
}
运行结果:
[root@localhost linuxc]# ./mysigprocmask
<-按下<CTRL>+<C>
进程无返回,说明信号被阻塞。
receive signal 2 10秒休眠结束后,进程收到信号 (信号被重新发送)