vxworks中如何使用Signal实现掩码操作
发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,这篇文章将为大家详细讲解有关vxworks中如何使用Signal实现掩码操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Kernel里,每个Task都有针对Sig
千家信息网最后更新 2025年01月23日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_USER
typedef 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安全错误
数据库的锁怎样保障安全
和平精英如何给服务器升级
绝地求生更改默认服务器
数据库原理习题2答案
辽宁软件开发技术咨询哪家好
计算机论文数据库一样怎么办
注册数据库驱动什么意思
使用数据库系统的优势
睢宁县校园网络安全
数据库查询总分最高分语句
英国网络安全工程师
天津库存管理软件开发公司
网络游戏服务器登录超时怎么办
福建新一代网络技术经验丰富
了解网络安全的手抄报
数据库热备份软件
dede 连接数据库
经济技术开发区景莘网络技术
大学生对网络安全的看法
山西万城互联网科技
杜甫数据库
网络安全学习报告
江西标准软件开发厂家
为什么链接数据库链接不上
服务器cpu 不够用怎么办
联想服务器硬盘检测不到
网络安全的理解与认识
保靖公安网络安全大队
备份ORALCE 数据库
江苏赛迪网络技术有限公司
招商银行软件开发依赖外包