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

📄 c04d_pipe.c

📁 Tornado的源代码资源包
💻 C
字号:
/* C04d_pipe.c P100 */

/* 头文件 */ 
#include "vxWorks.h" 
#include "ioLib.h" 
#include "pipeDrv.h" 

/* 宏定义 */ 
#define  MAX_MSGS    (10)  /* 管道中最大消息个数 */
#define  MAX_MSG_LEN (100) /* 消息长度 */
#define  STACK_SIZE  20000 /* 分配给每个任务的堆栈大小 */
#define  DELAY_TICKS 50    /* 向管道写入消息的间隔时间 */

/* 全局变量 */
int tidTask1;              /* 任务ID定义 */
int tidTask2;
int demoPipeFd;            /* 管道的文件描述符 */

/* 函数声明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
void   progStop(void);

/******************************************************************
*
* progStart - 启动实例程序
*
* 负责创建并打开管道,负责创建任务
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
    int result; /* 记录函数返回的结果 */
    
    /* 负责创建一个名为”/pipe/demo”的管道 */ 
    result = pipeDevCreate("/pipe/demo", MAX_MSGS, MAX_MSG_LEN);
    if (result == ERROR)
    {
        return ERROR;
    }
    
    /* 将管道打开,并将管道的文件描述符保存至demoPipeFd */
    demoPipeFd = open("/pipe/demo", O_RDWR, 0);
    if (demoPipeFd == ERROR)
    {
        return ERROR;
    }

    /* 创建任务 */
    tidTask1 = taskSpawn("tTask1", 200, 0, STACK_SIZE,
                          (FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0);

    tidTask2 = taskSpawn("tTask2", 220, 0, STACK_SIZE,
                          (FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0);

    return (OK);
}

/* 定义发送消息的内容 */
#define MESSAGE "Greetings from Task 1" 

/******************************************************************
*
* task1 – 周期性地向管道写入消息
*
* 用于周期性地向管道写入消息
*
* RETURNS: OK
*/
STATUS task1(void) 
{ 
    FOREVER
    {
        /* 向管道写入一条消息 */
        write(demoPipeFd, MESSAGE, sizeof(MESSAGE));

        taskDelay(DELAY_TICKS);
    }
    return (OK);
}

/******************************************************************
*
* task2 – 从管道读出消息并显示
*
* 通过select()侦听管道,当管道中有数据到来时,将消息读出并显示
*
* RETURNS: OK
*/
STATUS task2(void) 
{ 
    char    msgBuf[MAX_MSG_LEN]; /* 用于接收消息 */
    int     len = 0;             /* 保存接收的消息地长度 */
    int     result;              /* 用于保存select()的返回结果 */
    fd_set  readFd;              /* 文件描述符集合,用于侦听管道的读缓冲 */

    FOREVER
    {
        /* 初始化数据 */
        memset(msgBuf, 0, MAX_MSG_LEN);
        len = 0;
        
        /* 读出一整条消息,当管道空时,阻塞(Pend)在select()上等待 */ 
        while (len  < sizeof(MESSAGE))
        {
            /* 侦听管道的读缓冲 */
            FD_ZERO(&readFd);
            FD_SET(demoPipeFd, &readFd);
            result = select(sizeof(fd_set), &readFd, 
                            NULL, NULL, NULL);
            if (result <= 0)
            {
                return ERROR;
            }
            
            /* 从管道中读出数据 */
            len += read(demoPipeFd, msgBuf, sizeof(MESSAGE) - len);
        }
        
        /* 显示收到的消息 */ 
        printf("Message from task 1: %s\n", msgBuf); 
    } 

    return OK;
} 

/******************************************************************
*
* progStop - 停止实例程序
*
* 调用本函数来停止本实例程序,删除创建的任务并关闭、删除管道设备。
*
* RETURNS: N/A
*/
void progStop(void)
{
    /* 删除创建的任务 */
    taskDelete(tidTask1);
    taskDelete(tidTask2);

    /* 关闭打开的管道并删除管道设备 */
    close(demoPipeFd);
    pipeDevDelete("pipe/demo", TRUE);
    
    printf("BYE!\n");
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -