这篇文章将为大家详细讲解有关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 <stdio.h> /* printf() */
#include <signal.h> /* sigaction() */
#include <unistd.h> /* pause() */
#include <taskLib.h>/* 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的掩码是0x%016llx\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原掩码是0x%016llx\n", oldSet);
/* 查看当前掩码 */
sigprocmask(0, NULL, &newSet);
printf("当前掩码是0x%016llx\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实现掩码操作”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。