⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c04e_signal.c

📁 Tornado的源代码资源包
💻 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 + -