?? c04e_signal.c
字號:
/* C04e_signal.c P106 */
/* 頭文件 */
#include <vxWorks.h>
#include <semLib.h>
#include <errnoLib.h>
#include <sigLib.h>
/* 宏定義 */
#define STACK_SIZE 20000 /* 分配給任務的堆棧大小 */
/* 全局變量 */
SEM_ID semId; /* 信號量ID,用于阻塞(Pend)信號接收任務 */
int tidSigReceiver; /* 任務ID */
/* 函數聲明 */
STATUS sigReceiver(void);
STATUS txSignal(void);
void sigHandler(int sig);
/******************************************************************
*
* progStart - 啟動實例程序
*
* 負責創建信號量與任務,顯示幫助信息
*
* RETURNS: OK
*/
STATUS progStart(void)
{
/* 生成二進制信號量,初狀態為不可用 */
semId = semBCreate(SEM_Q_FIFO, SEM_EMPTY);
/* 啟動任務 */
tidSigReceiver = taskSpawn("tSigReceiver", 200, 0, STACK_SIZE,
(FUNCPTR)sigReceiver,
0,0,0,0,0,0,0,0,0,0);
/* 顯示提示信息 */
printf("\nRun cmd \"txSignal()\" in shell to send a signal.\n");
return OK;
}
/******************************************************************
*
* sigReceiver – 綁定信號處理程序與特定信號
*
* 責將信號處理程序與特定信號綁定,然后阻塞(Pend)起來等待信號
*
* RETURNS: OK
*/
STATUS sigReceiver(void)
{
/* 綁定信號處理程序與信號SIGUSR1 */
signal(SIGUSR1, sigHandler);
/* 將自己阻塞(Pend)起來 */
semTake(semId, WAIT_FOREVER);
return OK;
}
/******************************************************************
*
* sigHandler – 信號處理程序
*
* 信號處理程序,收到信號后打印一些簡單的信息。
*
* RETURNS: N/A
*/
void sigHandler
(
int sig /* 任務收到的信號編碼 */
)
{
/* 本實例中只處理SIGUSR1信號 */
if (sig != SIGUSR1)
{
logMsg("\nsigHandler: Invalid sig %d\n", sig, 0, 0, 0, 0, 0);
return;
}
/* 打印出執行信號處理程序的任務名稱 */
logMsg("\nsigHandler is running in %s 's context!\n",
taskName(taskIdSelf()), 0, 0, 0, 0, 0);
/* 打印出當前處理的信號編碼 */
logMsg("\nsigHandler is handling sig :%d!\n", sig, 0, 0, 0, 0, 0);
return;
}
/********************************************************************
*
* txSignal – 發起特定信號
*
* 用來向信號接收任務tSigReceiver發起特定的信號SIGUSR1
*
* RETURNS: OK
*/
STATUS txSignal(void)
{
kill(tidSigReceiver, SIGUSR1);
return OK;
}
txSignal()通過調用kill()操作來向信號接收任務tSigReceiver發起特定的信號SIGUSR1。
/********************************************************************
*
* progStop - 停止實例程序
*
* 調用本函數來停止本實例程序。
*/
void progStop(void)
{
/* 刪除創建的任務 */
taskDelete(tidSigReceiver);
/* 釋放信號量資源 */
semDelete(semId);
printf("BYE!\n");
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -