免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3397 | 回复: 2

select+管道 [复制链接]

论坛徽章:
0
发表于 2010-11-01 15:46 |显示全部楼层
  1. $ cat pipe.c
  2. #include <sys/select.h>
  3. #include <pthread.h>
  4. #include <unistd.h>
  5. #include <stdio.h>

  6. int fdctl[2];// 这个管道在建立线程之前建立。创建线程之后,两个线程各连接其中一端。因为不存在 fork 导致的 fd 复制,所以不需要像普通多进程环境一样 close 一端

  7. // 控制线程,使用 fdctl[0]
  8. void *thfun( void *arg )
  9. {
  10.   int i;
  11.   for ( i = 0; i < 3; ++i )
  12.     {
  13.       printf( "%d sec\n", i );
  14.       sleep( 1 );
  15.     }

  16.   close( fdctl[0] );// 当一个 fd 被关闭的时候,会触发 readable / writable 事件
  17. }

  18. // 主线程 select 阻塞
  19. int main()
  20. {
  21.   fd_set rdset;
  22.   int maxfd = 2;
  23.   pipe( fdctl );
  24.   maxfd = fdctl[1];
  25.   FD_ZERO( &rdset );
  26.   FD_SET( STDIN_FILENO, &rdset ); // 需要被监测的 fd,通常为 socket。这里用 stdin 代替
  27.   FD_SET( fdctl[1], &rdset ); // 控制管道。虽然 close 管道一端会同时引发 readable / writable 事件,但是由于 pipe 有缓冲,默认情况下 pipe 就是 writable 的,所以使用 rdset 进行监测

  28.   pthread_t tid;
  29.   pthread_create( &tid, NULL, thfun, NULL );

  30.   int res = select( maxfd + 1, &rdset, NULL, NULL, NULL ); // 同时监测 socket 和控制管道。writable set 也可以同时监测其它 fd
  31.   printf( "select() returned with %d\n", res );
  32.   if ( res == 1 ) {
  33.     if ( FD_ISSET( fdctl[1], &rdset ) ) // 是否控制管道产生的事件?
  34.       printf( "Ctrled Exit\n" ); // 如果是,则是由于控制线程触发。select 阻塞被成功打断
  35.     else
  36.       deal_with_fd(); // 不是控制管道的信息;处理来自 socket 的信息
  37.   }
  38.   return 0;
  39. }
复制代码
这是一段加精的程序,原链接为:http://bbs.chinaunix.net/viewthr ... p;extra=&page=1
看不懂这样写的意义和用途,请指教,谢谢   

论坛徽章:
0
发表于 2010-11-02 09:22 |显示全部楼层
up

论坛徽章:
0
发表于 2010-11-04 21:11 |显示全部楼层
利用管道这样的手段,统一处理多种事件,这些事件对象往往不是文件,比如消息队列等,这也是管道的常用技巧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP