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