Chinaunix首页 | 论坛 | 博客
  • 博客访问: 375874
  • 博文数量: 229
  • 博客积分: 968
  • 博客等级: 准尉
  • 技术积分: 1220
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-07 23:21
文章分类
文章存档

2011年(227)

2010年(2)

分类:

2011-04-23 18:36:08

原文地址:I/O多路复用 详解 作者:yuweixian4230

1.多路复用 select poll pselect 三个函数可用,可以参考unix环境高级编程
 
2. select 来等待多个io中任意一个io的事件发生 ,并不是阻塞
   从一个文件描述集中,找一个发生IO事件的进行操作,

3.实例分析

  通过调用poll函数来监听三个终端的输入,并分别进行相应的处理。在这里建立了一个poll函数监视的读文件描述符集,其中包含三个文件描述符,分别为标准输入文件描述符和两个管道文件描述符。通过监视主程序的虚拟终端输入来实现程序的控制,以两个管道作为数据输入,主程序将从两个管道读取的输入字符串写入到标准输出文件(屏幕)。




  
1.建立两个命名管道







代码


  1. /* multiplex_poll.c */
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #define MAX_BUFFER_SIZE 1024 /* 缓冲区大小 */
  11. #define IN_FILES 3 /* 多路复用输入文件数目 */
  12. #define TIME_DELAY 60000 /* 超时时间秒数:60秒 */
  13. #define MAX(a, b) ((a > b) ? (a) : (b))

  14. int main(void)
  15. {
  16. struct pollfd fds[IN_FILES];
  17. char buf[MAX_BUFFER_SIZE];
  18. int i, res, real_read, maxfd;

  19. /*首先按一定的权限打开两个源文件*/
  20. fds[0].fd = 0;
  21. if((fds[1].fd = open ("in1", O_RDONLY|O_NONBLOCK)) < 0)
  22. {
  23. printf("Open in1 error\n");
  24. return 1;
  25. }
  26. if((fds[2].fd = open ("in2", O_RDONLY|O_NONBLOCK)) < 0)
  27. {
  28. printf("Open in2 error\n");
  29. return 1;
  30. }
  31. /*取出两个文件描述符中的较大者*/
  32. for (i = 0; i < IN_FILES; i++)
  33. {
  34. fds[i].events = POLLIN;
  35. }

  36. /* 循环测试是否存在正在监听的文件描述符 */
  37. while(fds[0].events || fds[1].events || fds[2].events)
  38. {
  39. if (poll(fds, IN_FILES, 0) < 0)
  40. {
  41. printf("Poll error or Time out\n");
  42. return 1;
  43. }
  44. for (i = 0; i< IN_FILES; i++)
  45. {
  46. if (fds[i].revents) /* 判断在哪个文件上发生了事件*/
  47. {
  48. memset(buf, 0, MAX_BUFFER_SIZE);
  49. real_read = read(fds[i].fd, buf, MAX_BUFFER_SIZE);
  50. if (real_read < 0)
  51. {
  52. if (errno != EAGAIN)
  53. {
  54. return 1; /* 系统错误,结束运行*/
  55. }
  56. }
  57. else if (!real_read)
  58. {
  59. close(fds[i].fd);
  60. fds[i].events = 0; /* 取消对该文件的监听 */
  61. }
  62. else
  63. {
  64. if (i == 0) /* 如果在标准输入上有数据输入时 */
  65. {
  66. if ((buf[0] == 'q') || (buf[0] == 'Q'))
  67. {
  68. return 1; /*输入"q"或"Q"则会退出*/
  69. }
  70. }
  71. else
  72. { /* 将读取的数据先是到终端上 */
  73. buf[real_read] = '\0';
  74. printf("%s", buf);
  75. }
  76. } /* end of if real_read*/
  77. } /* end of if revents */
  78. } /* end of for */
  79. } /*end of while */
  80. exit(0);
  81. }

 multiplex_poll.rar  
阅读(1240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~