亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 20581 | 回復(fù): 13
打印 上一主題 下一主題

多線程程序中利用管道控制 select 行為 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-08-12 18:03 |只看該作者 |倒序?yàn)g覽
  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];// 這個(gè)管道在建立線程之前建立。創(chuàng)建線程之后,兩個(gè)線程各連接其中一端。因?yàn)椴淮嬖?fork 導(dǎo)致的 fd 復(fù)制,所以不需要像普通多進(jìn)程環(huán)境一樣 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] );// 當(dāng)一個(gè) fd 被關(guān)閉的時(shí)候,會(huì)觸發(fā) 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 ); // 需要被監(jiān)測的 fd,通常為 socket。這里用 stdin 代替
  27.   FD_SET( fdctl[1], &rdset ); // 控制管道。雖然 close 管道一端會(huì)同時(shí)引發(fā) readable / writable 事件,但是由于 pipe 有緩沖,默認(rèn)情況下 pipe 就是 writable 的,所以使用 rdset 進(jìn)行監(jiān)測

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

  30.   int res = select( maxfd + 1, &rdset, NULL, NULL, NULL ); // 同時(shí)監(jiān)測 socket 和控制管道。writable set 也可以同時(shí)監(jiān)測其它 fd
  31.   printf( "select() returned with %d\n", res );
  32.   if ( res == 1 ) {
  33.     if ( FD_ISSET( fdctl[1], &rdset ) ) // 是否控制管道產(chǎn)生的事件?
  34.       printf( "Ctrled Exit\n" ); // 如果是,則是由于控制線程觸發(fā)。select 阻塞被成功打斷
  35.     else
  36.       deal_with_fd(); // 不是控制管道的信息;處理來自 socket 的信息
  37.   }
  38.   return 0;
  39. }
復(fù)制代碼

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

論壇徽章:
1
榮譽(yù)版主
日期:2011-11-23 16:44:17
2 [報(bào)告]
發(fā)表于 2006-08-12 19:57 |只看該作者
能再把注釋標(biāo)注的更詳細(xì)一些嗎?還有是出于一個(gè)怎樣的考慮?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-08-12 20:49 |只看該作者
這樣的結(jié)構(gòu)在多線程程序中使用非常方便,而且避免使用 Signal 帶來的各種麻煩

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-08-13 10:15 |只看該作者
看不出這樣有什么作用
select 為什么不加超時(shí)設(shè)定?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-08-21 15:08 |只看該作者
當(dāng)程序希望有一個(gè)單獨(dú)的線程專門處理accept的時(shí)候,就需要與select同步了
如果select用了超時(shí),那么程序總是有一定比例的時(shí)間是在做無謂的FD_SET

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-08-21 15:12 |只看該作者
一般我是用fifo來同步select, pipe不大好用

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-11-29 10:17 |只看該作者
哦,監(jiān)聽pipe 有意思

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-11-29 10:30 |只看該作者
if ( res == 2) 呢

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2006-11-30 16:26 |只看該作者
為什么不用epoll,

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

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

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-12-28 23:14 |只看該作者
沒看出來是怎么控制select行為的?能否講一下問題引出的背景。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP