TCP/IP網絡編程第16章分離I/O流複習總結

利用前面的fork函數可以複製出一個文件描述符,然後區分輸入和輸出中使用的文件描述符,實際上用fork分離式分開了2個文件描述符的用途,而文件描述符本身不會根據輸入和輸出進行區分。但也屬於IO流分離。

有了上一章標準IO的知識後,可以再進行IO分流。
帶着以下目的進行下去:

  • 爲了將FILE指針按讀模式和寫模式加以區分。
  • 通過區分讀寫模式降低實現難度
  • 通過區分IO緩衝提高緩衝性能。

要實現真正的流分離,不得不考慮這之中帶來的EOF的問題。沒處理好這個問題並不是真正的流分離。

通過之前的內容很容易想出簡易的流分離的方法:

創建完套接字,是文件描述符,使用fdopen轉成一個讀的FILE結構體指針,一個寫的FILE結構體指針就行了。
其實這並不能做到流分離。

因爲當fclose讀或寫其中一個的時候,會將整個套接字都關閉。
咳 繼續用圖來清晰明瞭得說明
在這裏插入圖片描述
直接用fdopen來分開會導致如上圖所示的結果。

就是分開的倆個其實對應的是同一個文件描述符,關掉一個都會導致整個文件描述符的關閉,因爲該套接字只對應了這一個文件描述符,就緊接着會導致其對應的套接字的關閉。

一個套接字可以對應多個文件描述符,想要通過文件描述符來關閉套接字,需要將所有對應的文件描述都刪掉,想要不刪掉一個文件描述符就導致整個套接字的關閉,很明顯,就需要多弄幾個文件描述符出來。

所以我們需要複製一份文件描述符。

像這樣 小二!上圖~~
在這裏插入圖片描述
這樣,刪掉一個FILE指針就只會相應的刪掉一個文件描述符,不足以導致套接字的關閉,就好像很完美的實現了IO分流。

是的,很好的實現了IO分流了,然後只需要再關掉某一個的同時用shutdown傳遞EOF即可。

爲什麼還得用shutdown,因爲fclose並沒有傳遞EOF的功能。那爲什麼不能用close呢,用fileno轉換然後用close????關於這個還得好好研究研究,待補。

最後就只剩下複製文件描述符的具體操作了。
在這裏插入圖片描述
對於dup2,第二個參數就是它的返回值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章