出处:http://blog.163.com/shaoyi1110@126/blog/static/7432840120124852546380/
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL指针,那么目前的信号屏蔽字会由此指针返回。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。 参数how:SIG_BLOCK | 该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我 们希望阻塞的附加信号。 |
SIG_UNBLOCK | 该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的交集。set包含了 我们希望解除阻塞的信号. |
SIG_SETMASK | 该进程新的信号屏蔽是set指向的值 |
返回值
执行成功返回0,失败返回-1。错误代码
EFAULT | 参数set,oldset指针地址无法存取 |
EINTR | 此调用被中断 |
范例
#include <stdio.h> #include <signal.h> main() { sigset_t *set; set=(sigset_t*)malloc(sizeof(set)); sigemptyset(set); sigaddset(set,SIGINT); sigprocmask(SIG_SETMASK,set,NULL); while(1); return 0;
sigprocmask示例(演示添加信号掩码):
- #include <stdio.h>
- #include <signal.h>
- void checkset();
- void main()
- {
- sigset_tblockset;
- sigemptyset(&blockset);
- sigaddset(&blockset,SIGINT);
- sigaddset(&blockset,SIGTSTP);
- checkset();
- sigprocmask(SIG_SETMASK,&blockset,NULL);
- checkset();
- sigaddset(&blockset,SIGTERM);
- sigprocmask(SIG_BLOCK,&blockset,NULL);
- checkset();
- sigdelset(&blockset,SIGTERM);
- sigprocmask(SIG_UNBLOCK,&blockset,NULL);
- checkset();
- }
- void checkset()
- {
- sigset_tset set;
- printf("checksetstart:\n");
- if(sigprocmask(0,NULL,&set)<0)
- {
- printf("checksetsigprocmask error!!\n");
- exit(0);
- }
- if(sigismember(&set,SIGINT))
- printf("sigint\n");
- if(sigismember(&set,SIGTSTP))
- printf("sigtstp\n");
- if(sigismember(&set,SIGTERM))
- printf("sigterm\n");
- printf("checksetend\n");
- }
sigprocmask示例(演示添某部分代码不被信号打搅):
- #include <stdio.h>
- #include <signal.h>
- void checkset();
- void func();
- void main()
- {
- sigset_tblockset,oldblockset,pendmask;
- printf("pid:%ld\n",(long)getpid());
- signal(SIGINT,func); //信号量捕捉函数,捕捉到SIGINT,跳转到函数指针func处执行
- sigemptyset(&blockset); //初始化信号量集
- sigaddset(&blockset,SIGTSTP); //将SIGTSTP添加到信号量集中
- sigaddset(&blockset,SIGINT);//将SIGINT添加到信号量集中
- sigprocmask(SIG_SETMASK,&blockset,&oldblockset); //将blockset中的SIGINT,SIGTSTP阻塞掉,并保存当前信号屏蔽字
- /*执行以下程序时,不会被信号打搅*/
- checkset();
- sleep(5);
- sigpending(&pendmask); //检查信号是悬而未决的
- if(sigismember(&pendmask,SIGINT)) //SIGINT是悬而未决的。所谓悬而未决,是指SIGQUIT被阻塞还没有被处理
- printf("SIGINTpending\n");
- /*免打搅结束*/
- sigprocmask(SIG_SETMASK,&oldblockset,NULL); //恢复被屏蔽的信号SIGINT SIGTSTP
- printf("SIGINTunblocked\n");
- sleep(6);
- }
- void checkset()
- {
- sigset_tset;
- printf("checksetstart:\n");
- if(sigprocmask(0,NULL,&set)<0)
- {
- printf("checksetsigprocmask error!!\n");
- exit(0);
- }
- if(sigismember(&set,SIGINT))
- printf("sigint\n");
- if(sigismember(&set,SIGTSTP))
- printf("sigtstp\n");
- if(sigismember(&set,SIGTERM))
- printf("sigterm\n");
- printf("checksetend\n");
- }
- void func()
- {
- printf("hellofunc\n");
- }