功能描述:设定对信号屏蔽集内的信号的处理⽅式(阻塞或不阻塞)。⽤法:
#include int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);参数: how:⽤于指定信号修改的⽅式,可能选择有三种:SIG_BLOCK //加⼊信号到进程屏蔽。 SIG_UNBLOCK //从进程屏蔽⾥将信号删除。 SIG_SETMASK //将set的值设定为新的进程屏蔽。 set:为指向信号集的指针,在此专指新设的信号集,如果仅想读取现在的屏蔽值,可将其置为NULL。oldset:也是指向信号集的指针,在此存放原来的信号集。返回说明: 成功执⾏时,返回0。失败返回-1,errno被设为EINVAL。#include printf(\"Deal SIGINT\"); //SIGINT信号处理函数} int main(){ sigset_t newmask;sigset_t oldmask;sigset_t pendmask;struct sigaction act; act.sa_handler = handler; //handler为信号处理函数⾸地址sigemptyset(&act.sa_mask);act.sa_flags = 0; sigaction(SIGINT, &act, 0); //信号捕捉函数,捕捉Ctrl+Csigemptyset(&newmask);//初始化信号量集 sigaddset(&newmask, SIGINT);//将SIGINT添加到信号量集中 sigprocmask(SIG_BLOCK, &newmask, &oldmask);//将newmask中的SIGINT阻塞掉,并保存当前信号屏蔽字到Oldmasksleep (5);//休眠5秒钟,说明:在5s休眠期间,任何SIGINT信号都会被阻塞,如果在5s内收到任何键盘的Ctrl+C信号,则此时会把这些信息存在内核的队列中,等待5s结束后,可能要处理此信号。 sigpending(&pendmask);//检查信号是悬⽽未决的, if (sigismember(&pendmask, SIGINT))//SIGINT是悬⽽未决的。所谓悬⽽未决,是指SIGINT被阻塞还没有被处理{ printf(\"/nSIGINT pending/n\");} sigprocmask(SIG_SETMASK, &oldmask, NULL);//恢复被屏蔽的信号SIGINT //此处开始处理信号,调⽤信号处理函数 printf(\"SIGINT unblocked/n\");return (0);} 注意:上⾯还有⼀种⽅式: sigprocmask(SIG_BLOCK, &newmask, NULL); //阻塞sigprocmask(SIG_UNBLOCK, &newmask, NULL);//取消阻塞 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务