1. 程式人生 > 其它 >unp筆記6:I/O複用:select和poll函式

unp筆記6:I/O複用:select和poll函式

------------恢復內容開始------------
------------恢復內容開始------------
伺服器傳送的FIN會轉換為SOCKET的EOF,但是如果客戶端阻塞於讀stdin,那麼會很久以後才能收到這個EOF,即它不能第一時間知道伺服器已經要關閉了.

I/O複用的應用場景

  1. 使用者處理多個描述符時,必須使用IO複用
  2. 一個使用者同時處理多個套接字
  3. 伺服器既要處理監聽套接字,又要處理已連線套接字
  4. 既要使用TCP,又要使用UDP
  5. 伺服器要處理多個服務

同步IO和非同步IO的概念

同步IO使得呼叫程序阻塞,直到IO操作完成.
非同步IO不會使呼叫程序阻塞,呼叫程序立即返回.
(只有POSIX非同步IO模型是真正的非同步IO,IO操作不會導致程式阻塞[IO和程式執行同時進行])

select函式

套接字描述符就緒條件

套接字滿足下面條件之一即準備好

  1. 接收緩衝區資料位元組數大於低水位標記。對TCP和UDP來說,值為1
  2. 收到了對端的FIN,此時呼叫read會立即返回EOF
  3. 對於監聽套接字來說,已完成連線數不為0
  4. 套接字有錯誤待處理,此時輸入輸出不會阻塞,會立即返回-1

套接字滿足下面條件之一即準備好:(寫是相當容易滿足的)

  1. 套接字的傳送緩衝區可用空間大於套接字設定的低水位值(TCP和UDP都是2048),並且該套接字已連線(或者像UDP一樣不需要連線)
  2. 寫半部關閉,此時寫會引發SIGPIPE
  3. 使用非阻塞式的connect已經建立連線,或者connect以失敗告終
  4. 有套接字錯誤待處理,此時寫將會返回-1

注意:如果套接字發生了錯誤,那麼select會認為它此時可讀可寫。
UDP應該總是可寫的(緩衝區僅用於一次互動,只要傳送低水位值小於等於傳送緩衝區大小)

shutdown

  1. close是引用計數的,但是shutdown立即觸發四次揮手。
  2. close既關閉讀又關閉寫,但是有時候我們僅僅不再寫(這稱為半關閉),這使用shut_wr選項即可

為什麼同時使用select和帶緩衝的讀函式是有罪的?

如果你用帶緩衝的讀函式,你很可能只讀了一行,輸入緩衝區裡還有資料。但是select並不知道這部分緩衝區的存在,select看的是套接字的緩衝區,它發現裡面沒有資料就不會觸發。

------------恢復內容結束------------