c04e_signal.c

来自「Tornado的源代码资源包」· C语言 代码 · 共 126 行

C
126
字号
/* 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 + =
减小字号Ctrl + -
显示快捷键?