您好,欢迎来到六九路网。
搜索
您的当前位置:首页sigprocmask()函数实例详解

sigprocmask()函数实例详解

来源:六九路网
sigprocmask()函数实例详解

功能描述:设定对信号屏蔽集内的信号的处理⽅式(阻塞或不阻塞)。⽤法:

#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 #include #include void handler(int sig){

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

本站由北京市万商天勤律师事务所王兴未律师提供法律服务