unp筆記6:I/O複用:select和poll函式
阿新 • • 發佈:2022-03-14
------------恢復內容開始------------
------------恢復內容開始------------
伺服器傳送的FIN會轉換為SOCKET的EOF,但是如果客戶端阻塞於讀stdin,那麼會很久以後才能收到這個EOF,即它不能第一時間知道伺服器已經要關閉了.
I/O複用的應用場景
- 使用者處理多個描述符時,必須使用IO複用
- 一個使用者同時處理多個套接字
- 伺服器既要處理監聽套接字,又要處理已連線套接字
- 既要使用TCP,又要使用UDP
- 伺服器要處理多個服務
同步IO和非同步IO的概念
同步IO使得呼叫程序阻塞,直到IO操作完成.
非同步IO不會使呼叫程序阻塞,呼叫程序立即返回.
(只有POSIX非同步IO模型是真正的非同步IO,IO操作不會導致程式阻塞[IO和程式執行同時進行])
select函式
略
套接字描述符就緒條件
套接字滿足下面條件之一即準備好讀:
- 接收緩衝區資料位元組數大於低水位標記。對TCP和UDP來說,值為1
- 收到了對端的FIN,此時呼叫read會立即返回EOF
- 對於監聽套接字來說,已完成連線數不為0
- 套接字有錯誤待處理,此時輸入輸出不會阻塞,會立即返回-1
套接字滿足下面條件之一即準備好寫:(寫是相當容易滿足的)
- 套接字的傳送緩衝區可用空間大於套接字設定的低水位值(TCP和UDP都是2048),並且該套接字已連線(或者像UDP一樣不需要連線)
- 寫半部關閉,此時寫會引發SIGPIPE
- 使用非阻塞式的connect已經建立連線,或者connect以失敗告終
- 有套接字錯誤待處理,此時寫將會返回-1
注意:如果套接字發生了錯誤,那麼select會認為它此時可讀可寫。
UDP應該總是可寫的(緩衝區僅用於一次互動,只要傳送低水位值小於等於傳送緩衝區大小)
shutdown
- close是引用計數的,但是shutdown立即觸發四次揮手。
- close既關閉讀又關閉寫,但是有時候我們僅僅不再寫(這稱為半關閉),這使用shut_wr選項即可
為什麼同時使用select和帶緩衝的讀函式是有罪的?
如果你用帶緩衝的讀函式,你很可能只讀了一行,輸入緩衝區裡還有資料。但是select並不知道這部分緩衝區的存在,select看的是套接字的緩衝區,它發現裡面沒有資料就不會觸發。
------------恢復內容結束------------