vxworks中如何使用Signal实现掩码操作
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章将为大家详细讲解有关vxworks中如何使用Signal实现掩码操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Kernel里,每个Task都有针对Sig
千家信息网最后更新 2026年11月01日vxworks中如何使用Signal实现掩码操作启动一个Task,挂接SIGUSR1的处理处理函数,并屏蔽SIGUSR2。执行效果如下 可以看到,设置掩码之前,不会拦截任何Signal,即原掩码是64个0
这篇文章将为大家详细讲解有关vxworks中如何使用Signal实现掩码操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
Kernel里,每个Task都有针对Signal的掩码(Mask)。掩码值为1表示拦截该Signal,即不处理Signal;掩码值为0表示会处理该Signal。而且默认情况下每个Task都会处理发给自己的Signal,只不过默认的处理方案是SIG_IGN(丢弃/忽略)。因此,要对Signal有所反应,就需要手动挂接Signal的处理机制了。今天看看Mask相关的操作
/* Signal的来源 */#define SI_SYNC 0 /* (Not posix) gernerated by hardware */#define SI_USER -1 /* signal from kill() function */#define SI_QUEUE -2 /* signal from sigqueue() function */#define SI_TIMER -3 /* signal from expiration of a timer */#define SI_ASYNCIO -4 /* signal from completion of async I/O */#define SI_MESGQ -5 /* signal from arrival of a message */#define SI_CHILD -6 /* signal from child, stopped or terminated */#define SI_KILL SI_USERtypedef unsigned long long sigset_t;/* POSIX: 清空Signal掩码, 常用于初始化 */int sigemptyset(sigset_t *pSet);/* POSIX: 与sigemptyset()相反, 置所有Signal的bit位为1 */int sigfillset(sigset_t *pSet);/* POSIX: 在掩码pSet中添加signum */int sigaddset(sigset_t *pSet, int signum);/* POSIX: 在掩码pSet中去除signum */int sigdelset(sigset_t *pSet, int signum);/* POSIX: 在掩码pSet中是否包含signum */int sigismember(sigset_t *pSet, int signum);/* POSIX: 获取当前任务中阻塞的Signal */int sigpending(sigset_t *pSet);#define SIG_BLOCK 1#define SIG_UNBLOCK 2#define SIG_SETMASK 3/* POSIX: 修改/查看掩码, 每个bit位表示一种Signal,* 1表示拦截, 0表示响应* pSet非空时,修改任务的Signal掩码* pOldSet非空时,查看任务原有的Signal掩码* how为修改方式* SIG_BLOCK - 在原有掩码上添加pSet* SIG_UNBLOCK - 在原有源码上去除pSet* SIG_SETMASK - 设置掩码为pSet*/int sigprocmask(int how, sigset_t *pSet, sigset_t *pOldSet);/* 设置掩码* 类似于sigprocmask(SIG_SETMASK, mask, ...)* 只支持低32位* 不建议使用*/int sigsetmask(int mask);/* 添加掩码* 类似于sigprocmask(SIG_BLOCK, mask, ...)* 只支持低32位* 不建议使用*/int sigblock(int mask);
跑个例子,看看掩码的效果
/** Signal的使用* 公众号: VxWorks567*/#include/* printf() */ #include/* sigaction() */ #include/* pause() */ #include/* taskName() */ static void myHandler(int sigNum,siginfo_t *pInfo,void *pContext){printf ("\n从%d接收到Signal(#%d), 并附带数值%d\n",pInfo->si_code, sigNum, pInfo->si_value.sival_int);printf("任务%s的掩码是0x6llx\n", taskName(0),((struct sigcontext *)pContext)->sc_mask);}void testSig(){struct sigaction newAction;sigset_t newSet;sigset_t oldSet;taskDelay(10);/* 注册Signal处理函数到SIGUSR1 */newAction.sa_sigaction = myHandler;newAction.sa_mask = 0;newAction.sa_flags = SA_SIGINFO;sigaction(SIGUSR1, &newAction, NULL);/* 拦截SIGUSR2 */sigemptyset(&newSet);sigaddset(&newSet, SIGUSR2);sigprocmask(SIG_BLOCK, &newSet, &oldSet);printf("\n原掩码是0x6llx\n", oldSet);/* 查看当前掩码 */sigprocmask(0, NULL, &newSet);printf("当前掩码是0x6llx\n", newSet);pause();printf("任务%s被Signal激活\n", taskName(0));}/* 发送SIGUSR1到testSig */void giveSig(int tId){union sigval value;value.sival_int = 100;printf("发送Signal(#%d)到任务%s, 并附带数值%d\n",SIGUSR1, taskName(tId), value.sival_int);sigqueue(tId, SIGUSR1, value);}
关于"vxworks中如何使用Signal实现掩码操作"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
处理
任务
篇文章
函数
建议
效果
数值
更多
支持
不错
实用
例子
公众
内容
只不过
情况
手动
文章
方式
方案
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
江苏根荣互联网科技
互联网科技公司税收优惠
互联网中国科技
互联网金融 金融科技
华宇互联网科技
远拓互联网科技
科技互联网公司logo
互联网科技logo设计
互联网科技的未来发展
互联网高科技股票
深圳前海聚择互联网科技有限公司
河南猎农互联网科技有限公司
荆州市昕露互联网络科技有限公司
苏州铭阳互联网科技有限公司
中和天地互联网科技有限公司
区块链结合互联网科技
锡山区互联网智能科技产品供应
互联网科技股为什么大涨
湖北辰鑫科技互联网
科技发展第三阶段互联网时代
互联网科技金融公司
互联网科技logo设计
新华互联网科技2019
宁波青枫互联网科技有限公司
未来五年的互联网科技
本届互联网博览会上的黑科技
互联网数据科技专业
江苏互联网智能科技软件
银川新华互联网科技学校原画
数字科技和互联网金融哪个好