前言
在之前的文章中,我具體實現了一個併發回射伺服器並給它載入了殭屍子程式的自動清理訊號機制。在正常情況下,它已經可以很好地工作了,但它能否合理應對一些特殊情況呢?
問題發現
先來看看當伺服器的客戶子程式突然崩潰的情況。
1. 終端啟動上篇文章中已經實現了的併發伺服器
2. 在另一個終端中啟動上篇文章中已經實現了的客戶端並執行回射測試:
可以看到執行良好。
3. 找到伺服器子程式的ID,然後kill掉它:
4. 再回到客戶端執行回射,但這一次我們得到這樣的結果:
表面上看,客戶端的響應也是正常的,但在實際應用中卻大錯特錯了。
因為當伺服器的客戶子程式結束,這邊客戶端應該立馬收到連線失效的資訊,而不是還一廂情願 地往裡面輸資料白白浪費時間。
在《UNIX網路程式設計中》作者是這樣描述這種情況的“ 當FIN分節到達時,客戶正阻塞在fgets上。客戶實際是應對兩個描述符:套接字分節和使用者輸入。程式不能阻塞於這兩個描述符中的某一個上,而是應該阻塞於任何一個上 ”。那麼如何做到“ 阻塞於任何一個上 "?
這就引出了本文要討論的重要概念:IO複用。
重要概念:IO複用
在程式有多個IO( 如套接字描述符和使用者輸入 )的情況下,核心一旦發現某個或多個IO條件就緒,就通知程式。這個能力就叫做IO複用。
具體實現
請看接下來的兩篇文章:《IO複用之select實現》或《IO複用之poll實現》。