1.多路复用 select poll pselect 三个函数可用,可以参考unix环境高级编程 2. select 来等待多个io中任意一个io的事件发生 ,并不是阻塞
从一个文件描述集中,找一个发生IO事件的进行操作,
3.实例分析
通过调用poll函数来监听三个终端的输入,并分别进行相应的处理。在这里建立了一个poll函数监视的读文件描述符集,其中包含三个文件描述符,分别为标准输入文件描述符和两个管道文件描述符。通过监视主程序的虚拟终端输入来实现程序的控制,以两个管道作为数据输入,主程序将从两个管道读取的输入字符串写入到标准输出文件(屏幕)。
1.建立两个命名管道
代码
- /* multiplex_poll.c */
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#include
-
#define MAX_BUFFER_SIZE 1024 /* 缓冲区大小 */
-
#define IN_FILES 3 /* 多路复用输入文件数目 */
-
#define TIME_DELAY 60000 /* 超时时间秒数:60秒 */
-
#define MAX(a, b) ((a > b) ? (a) : (b))
-
-
int main(void)
-
{
-
struct pollfd fds[IN_FILES];
-
char buf[MAX_BUFFER_SIZE];
-
int i, res, real_read, maxfd;
-
-
/*首先按一定的权限打开两个源文件*/
-
fds[0].fd = 0;
-
if((fds[1].fd = open ("in1", O_RDONLY|O_NONBLOCK)) < 0)
-
{
-
printf("Open in1 error\n");
-
return 1;
-
}
-
if((fds[2].fd = open ("in2", O_RDONLY|O_NONBLOCK)) < 0)
-
{
-
printf("Open in2 error\n");
-
return 1;
-
}
-
/*取出两个文件描述符中的较大者*/
-
for (i = 0; i < IN_FILES; i++)
-
{
-
fds[i].events = POLLIN;
-
}
-
-
/* 循环测试是否存在正在监听的文件描述符 */
-
while(fds[0].events || fds[1].events || fds[2].events)
-
{
-
if (poll(fds, IN_FILES, 0) < 0)
-
{
-
printf("Poll error or Time out\n");
-
return 1;
-
}
-
for (i = 0; i< IN_FILES; i++)
-
{
-
if (fds[i].revents) /* 判断在哪个文件上发生了事件*/
-
{
-
memset(buf, 0, MAX_BUFFER_SIZE);
-
real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE);
-
if (real_read < 0)
-
{
-
if (errno != EAGAIN)
-
{
-
return 1; /* 系统错误,结束运行*/
-
}
-
}
-
else if (!real_read)
-
{
-
close(fds[i].fd);
-
fds[i].events = 0; /* 取消对该文件的监听 */
-
}
-
else
-
{
-
if (i == 0) /* 如果在标准输入上有数据输入时 */
-
{
-
if ((buf[0] == 'q') || (buf[0] == 'Q'))
-
{
-
return 1; /*输入"q"或"Q"则会退出*/
-
}
-
}
-
else
-
{ /* 将读取的数据先是到终端上 */
-
buf[real_read] = '\0';
-
printf("%s", buf);
-
}
-
} /* end of if real_read*/
-
} /* end of if revents */
-
} /* end of for */
-
} /*end of while */
-
exit(0);
-
}
multiplex_poll.rar
阅读(5523) | 评论(0) | 转发(3) |