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
 multiplex_poll.rar   