[問題] select read & write同一fd

看板C_and_CPP (C/C++)作者 (青)時間16年前 (2009/07/30 19:53), 編輯推噓1(1012)
留言13則, 3人參與, 最新討論串1/3 (看更多)
請問各位 就是我目前要對一個Socket fd做動作 由於他是在Server端,而且這個fd要可以做讀、寫的動作 所以我採用select做出Async I/O的作業方式 那以下簡略描述一下目前的想法: int Select_Check; /* * Socket 設定 */ ...... ...... ...... Sock.Bind(); Sock.Listen(10); FD_SET(Sock, &ReadSet); FD_SET(Sock, &WriteSet); while (1) { Select_Check = select(maxfd, &ReadSet, &WriteSet, NULL, Timeout); /* * 以下進入問題,不多做其他的判斷及處理 */ if (Select_Check) { ......... ......... ......... } } 我想請問的是黃色區塊的部份 這個部份,我是應該直接去做FD_ISSET的判斷嗎? 像是如下: if (FD_ISSET(Sock, &ReadSet) { ....... } else if (FD_ISSET(Sock, &WriteSet) { ....... } else { ....... } 我想問一下,上述的寫法會不會有問題? 因為我不懂select是用什麼去判別資料是否準備好 還請各位先進指點一番,謝謝 -- 要感謝的人太多了,那就謝天吧 要改得程式碼太多了,那就改天吧 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.0.83

07/30 21:26, , 1F
select就是去monitor一堆fd(rfd, wfd, ...)有沒有event
07/30 21:26, 1F

07/30 21:26, , 2F
發生,有相對於某個fd的event發生,select就會收到東西
07/30 21:26, 2F

07/30 21:27, , 3F
這是我的理解,有錯請高手嚴格指正,謝謝
07/30 21:27, 3F

07/30 22:35, , 4F
read的部份我能理解,但是write的部份就不太清楚了
07/30 22:35, 4F

07/30 22:35, , 5F
可否詳加說明一點,謝謝
07/30 22:35, 5F

07/30 22:38, , 6F
我猜是在TCP的時候會有重新write的關係 所以要空了才set
07/30 22:38, 6F

07/30 22:42, , 7F
manual 說 fd is ready to write
07/30 22:42, 7F

07/31 08:16, , 8F
不知道我理解的對不對
07/31 08:16, 8F

07/31 08:17, , 9F
看過S大的講法,也就是說memory清空之後
07/31 08:17, 9F

07/31 08:17, , 10F
就是ready to write嗎?
07/31 08:17, 10F

07/31 08:18, , 11F
這樣的話,select也算是edge trigger了嘛?
07/31 08:18, 11F

08/01 00:18, , 12F
我不曉得你的edge trigger是什麼意思 我只知道說
08/01 00:18, 12F

08/01 00:19, , 13F
這可以當成類似 if( kbhit() ) getch(); 的動作
08/01 00:19, 13F
文章代碼(AID): #1ASOdGwY (C_and_CPP)
文章代碼(AID): #1ASOdGwY (C_and_CPP)