📄 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 + -