免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20350 | 回复: 13

多线程程序中利用管道控制 select 行为 [复制链接]

论坛徽章:
0
发表于 2006-08-12 18:03 |显示全部楼层
  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. }
复制代码

[ 本帖最后由 wolf0403 于 2006-8-12 20:48 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
发表于 2006-08-12 19:57 |显示全部楼层
能再把注释标注的更详细一些吗?还有是出于一个怎样的考虑?

论坛徽章:
0
发表于 2006-08-12 20:49 |显示全部楼层
这样的结构在多线程程序中使用非常方便,而且避免使用 Signal 带来的各种麻烦

论坛徽章:
0
发表于 2006-08-13 10:15 |显示全部楼层
看不出这样有什么作用
select 为什么不加超时设定?

论坛徽章:
0
发表于 2006-08-21 15:08 |显示全部楼层
当程序希望有一个单独的线程专门处理accept的时候,就需要与select同步了
如果select用了超时,那么程序总是有一定比例的时间是在做无谓的FD_SET

论坛徽章:
0
发表于 2006-08-21 15:12 |显示全部楼层
一般我是用fifo来同步select, pipe不大好用

论坛徽章:
0
发表于 2006-11-29 10:17 |显示全部楼层
哦,监听pipe 有意思

论坛徽章:
0
发表于 2006-11-29 10:30 |显示全部楼层
if ( res == 2) 呢

论坛徽章:
0
发表于 2006-11-30 16:26 |显示全部楼层
为什么不用epoll,

http://blog.chinaunix.net/u/26390/showart.php?id=207259

[ 本帖最后由 2195113 于 2006-11-30 16:31 编辑 ]

论坛徽章:
0
发表于 2006-12-28 23:14 |显示全部楼层
没看出来是怎么控制select行为的?能否讲一下问题引出的背景。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP