您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。