#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);
int sigpending(sigset_t *set);
上面几个函数都可以鉴名思意,下面就简单介绍一下用法,帮助快速理解和记忆
这几个函数组合起来一般是用来延迟信号处理,即进程收到指定信号时不立即处理信号事件,而是待调用sigpending时再处理
使用流程一般为:
1、设置信号处理方法 signal
2、初始化待设置信号集 sigemptyset(全部清0) 或 sigfillset(全部置1)
3、添加待设置信号集 sigaddset
4、设置信号屏蔽 sigprocmask
5、进程休眠或处理其他事件
6、查看捕获到的被延迟的信号 sigpending
7、还原初始信号集 sigprocmask
示例代码如下:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <signal.h> 5 #include <unistd.h> 6 void sigfunc(int signum); 7 int main() 8 { 9 sigset_t newsigset, oldsigset, pendsigset; 10 //1-设置捕获信号 11 signal(SIGINT, sigfunc); 12 //2-初始化信号集 13 sigemptyset(&newsigset); 14 //3-添加待处理信号集 15 sigaddset(&newsigset, SIGINT); 16 //4-设置阻塞信号集 17 sigprocmask(SIG_BLOCK, &newsigset, &oldsigset); 18 //5-休眠 19 for (int i=0; i<5; ++i) 20 { 21 printf("sleeping %d\n", i); 22 sleep(1); 23 } 24 //6-检查获取到的被阻塞的信号集 25 sigpending(&pendsigset); 26 printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT)); 27 //7-还原被屏蔽的信号集 28 printf("recover signal \n"); 29 sigprocmask(SIG_SETMASK, &oldsigset, 0); 30 return 0; 31 } 32 33 void sigfunc(int signum) 34 { 35 printf("catch SIGINT | signum = %d\n", signum); 36 }
测试结果:
sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2