2006年10月19日 23:13

How to use the select(), an I/O Multiplexer

「石頭閒語」已轉移到 rocksaying.tw 。 本文新網址請點擊此連結:《閱讀全文》。
How to use the select(), an I/O Multiplexer

  • shirock 發表於樂多C/C++/C#/Java編輯本文
    樂多分類:學術/學習切換閱讀版型
    贊助商廣告
     
    引用列表:
    在 Web 應用上,當瀏覽器向伺服端索取資料,而資料尚未存在或尚未被輸入時,我們通常令伺服端回傳代表目前無資料的訊息,並告知使用者稍候再讀取。當 JavaScript 被帶入 Web 應用程式開發領域後,我們在客戶端設計上,便運用 JavaScript 在間隔一段時間後,主動地向伺服端查詢是否有資料可以讀取。由於這個動作是放在一個無窮迴圈中,令它反覆地向伺服端執行查詢動作,故而我們將之稱為「輪詢」(polling)。 然而這種普遍地解法,實際上是一種反模式(Anti-pattern),也就是把反
    Ajax and Blocking IO - To Resolve Polling Anti-pattern【石頭閒語】 at 2010年3月22日 15:11
    回應文章
    select()的第一個參數maxfd並不是指"共有幾個設備要 select() 處理",而是指你用FD_SET()關聯的file descriptor中最大的那個+1,比方說現在最大是567(open()或socket()傳回的fd為整數),那就填568
    | 檢舉 | Posted by godspeedlee at 2012年7月7日 02:30
    嗯,我那時大概是被 manpage 上寫的 nfds 這個參數名稱誤導了,沒有細看。
    | 檢舉 | Posted by 遊手好閒的石頭成 at 2012年7月30日 16:35
    請問改寫這段code成這樣是否適合? 感謝!
    if( FD_ISSET(fileno(stdin), &readmask) ) { fgets(mystr, sizeof(mystr), stdin); fputs(mystr, strlen(mystr), hisout); printf("I say: %s", mystr); }
    if( FD_ISSET(fileno(hisin), &readmask) ) { fgets(hisstr, sizeof(hisstr), hisin); printf("He says: %s", hisstr); }
    | 檢舉 | Posted by 老楊 at 2013年9月17日 18:03
    喔,可以。
    select() 可以一次回報多個設備可讀,所以在一個loop中判斷每個設備是否可讀是個好主意。
    | 檢舉 | Posted by 遊手好閒的石頭成 at 2013年9月18日 09:07
     
    -
    贊助商廣告