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

📄 c07b_select.c

📁 Tornado的源代码资源包
💻 C
字号:

/* 头文件 */ 
#include "VxWorks.h"
#include "selectLib.h"
#include "fcntl.h"
#include "ioLib.h"
#include "stdio.h"
#include "string.h"

/* 宏定义 */
#define MAX_FDS  2
#define MAX_DATA 1024
#define PIPEHI   "/pipe/highPriority"
#define PIPENORM "/pipe/normalPriority"

/******************************************************************
*
* selServer -当管道可用时,从中读取数据。
*
*打开两个文件描述符,当任何一个有数据,或两个都有数据时,读取数据。本程序假设管道 *已经创建。
*
* RETURNS: OK, ERROR
*/
STATUS selServer(void)
{
    struct fd_set readfds;   /* 所有文件描述符的标识位集合 */
    int    fds[MAX_FDS];     /* 文件描述符数组,任务在这些文件描述符上等待*/
    int    width;            /* fd_set中需要监视的位数 */
    int    i;                /* 文件描述符数组的索引*/
    char   buffer[MAX_DATA]; /* 存放数据的buffer */
    
    /* 打开管道,得到管道的文件描述符 */
    if ((fds[0] = open(PIPEHI, O_RDONLY, 0)) == ERROR)
        return(ERROR);
    if ((fds[1] = open(PIPENORM, O_RDONLY, 0)) == ERROR)
        return(ERROR);

    /* 循环读来自client的数据并处理 */
    FOREVER
    {
        /* 将文件描述符标识集清空  */
        FD_ZERO(&readfds);              

        /* 将要监视的文件描述符的标识位置1 */
        FD_SET(fds[0], &readfds);
        FD_SET(fds[1], &readfds);

        /* 确定要监视的文件描述符中的最大值,
        这个最大值决定了select()需要监视的最大位数。*/
        width = (fds[0] > fds[1]) ? fds[0] : fds[1];
        width++;

        /* 挂起,等待有文件描述符变为就绪 */
        if (select(width, &readfds, NULL, NULL, NULL) == ERROR)
            return(ERROR);
        /* 逐个文件描述符检查,并从就绪的文件描述符中读数据。 */
        for(i=0; i< MAX_FDS; i++)
        {
            /* 检查这个文件描述符是否就绪 */
            if (FD_ISSET(fds[i], &readfds))
            {
                /* 从该就绪的文件描述符中读数据 */
                read(fds[i], buffer, MAX_DATA);
                /* 向client提供服务,这里以打印表示。*/
                printf("SELSERVER Reading from %s: %s\n",
                       (i == 0) ? PIPEHI : PIPENORM, buffer);
            }
        }
    }
}

⌨️ 快捷键说明

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