信号集处理函数
1. int sigemptyset(sigset_t *set); 清空信号集,将信号集全部置0 2. 3. int sigfillset(sigset_t *set); 将信号集全部置1 4. 5. int sigaddset(sigset_t *set, int signo) 把信号集的某一个信号位置1 6. 7. int sigdelset(sigset_t *set, int signo); 把信号集的某一个信号位置0; 8. 9. int sigismember(const sigset_t *set, int signo); 判断这个信号集的某个信号位是否置位
sigprocmask函数
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。调用函数sigprocmask可以检测或更改其信号屏蔽字,或者在一个步骤中同时执行这两个操作。
1. #include <signal.h> 2. 3. int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
首先,若oldset是非空指针,那么进程的当前信号屏蔽字通过oldset返回。
其次,若set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。
若set是空指针,则不改变该进程的信号屏蔽字,how的值也无意义了。
下面表格说明了how可选用的值。注意,不能阻塞SIGKILL和SIGSTOP信号。
How参数 |
说明 |
SIG_BLOCK |
该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的的并集,set包含了我们希望阻塞的附加信号 |
SIG_UNBLOCK |
该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号补集的交集,set包含了我们希望解除阻塞的信号 |
SIG_SETMASK |
该进程新的信号屏蔽字将被set指向的信号集的值代替 |
返回值:成功返回0,出错返回-1
sigpending函数
1. #include <signal.h> 2. 3. int sigpending(sigset_t *set);
sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则返回-1。
程序:通过sigprocmask设置要阻塞的信号,通过sigpending打印已经阻塞的信号,并在终端输出
1. #include <stdio.h> 2. #include <signal.h> 3. #include <unistd.h> 4. 5. void printsigset(const sigset_t *set) 6. { 7. int i ; 8. for(i=1; i<32; i++) 9. if(sigismember(set, i) == 1) //判断信号集是否置位 10. putchar('1'); 11. else 12. putchar('0'); 13. puts(""); 14. } 15. 16. int main(void) 17. { 18. sigset_t s, p; 19. sigemptyset(&s); //清空信号集 20. sigaddset(&s, SIGINT); //将信号位2:SIGINT置1 21. sigprocmask(SIG_BLOCK, &s, NULL); //在信号集中添加刚才sigaddset的SIGINT信号阻塞 22. while(1){ 23. sigpending(&p); //调用sigpending读取当前进程未决信号集 24. printsigset(&p); 25. sleep(1); 26. } 27. return 0; 28. }
执行结果如下:在键盘上按Ctrl+C可以产生SIGINT信号