2010-08-13 287 views
9

read(2)和write(2)既適用於套接字描述符也適用於文件描述符。在文件描述符,用戶文件描述符表 - >文件表的情況下,最後到它檢查文件類型(常規文件/字符/塊)的inode表中,並相應地讀取。在char spl文件的情況下,它會根據char設備開關中的文件主編號獲取函數指針,並調用爲該設備註冊的相應讀/寫例程。 通過獲取塊設備開關中的函數指針,爲塊特殊文件調用類似適當的讀/寫例程。套接字描述符與文件描述符

請讓我知道當在套接字描述符上調用read/write時會發生什麼。如果讀/寫在套接字描述符上工作,我們不能使用open而不是套接字來獲取描述符?

+0

不能告訴你確切** **發生了什麼(試着看內核源代碼,如果你真的想知道),但本質上它會通過該請求將傳遞給TCP驅動程序,該驅動程序會將其傳遞到網絡堆棧的下方,直到它到達網絡接口卡的驅動程序。如果您想知道網絡堆棧的每個層面通常會做什麼,請查看* OSI模型*。至於'open'和'socket':它們有不同的參數,因爲需要指定的信息因打開文件或套接字而不同。 – David 2010-08-13 08:53:36

+0

我想知道在調用socket()時分配的數據結構是什麼,在inode表中存儲了什麼信息,它在調用讀/寫時如何最終到達網絡接口卡驅動程序例程 – 2010-08-13 10:02:52

+0

說明read/write包裝系統調用。大部分工作都是在內核空間完成的。 這是一種抽象,或「虛擬化」:只需將塊文件,套接字或許多其他內容作爲「文件」。一個文件具有讀,寫,打開等操作。但是在內核中定義讀取套接字或讀取磁盤文件的真正實現。如果需要,甚至可以定義從文件中讀取的「寫入」。 – tristan 2010-08-24 14:00:02

回答

2

套接字描述符也與文件結構相關聯,但是該結構的一組file_operations函數與通常的不同。這些描述符的初始化和使用因此是不同的。讀取和寫入內核級接口的一部分恰好相當。

+0

我想知道在調用socket()時分配的數據結構是什麼,inode表中存儲了什麼信息,它如何最終到達網絡接口卡驅動程序例程調用讀/寫 – 2010-08-13 09:31:40

+0

沒有發生,而是故意使其相同 – Yerken 2016-12-19 23:48:11

0

讀取和寫入對於某些狀態的某些類型的套接字有效;這一切都取決於在內核中傳遞的各種結構。

原則上,open()可以創建一個套接字描述符,但是BSD套接字API從來沒有這樣定義過。

還有一些其他的(有點linux特定的)類型的文件描述符,它們是由open()以外的系統調用打開的,例如epoll_create或timerfd_create。這些工作是一樣的。

6

正如我在內存中知道的那樣,文件描述符將包含標誌來標識此fd的文件系統類型。內核將根據文件系統類型調用相應的處理函數。你可以在linux內核中看到源碼read_write.c。

要在簡短的發言中,內核所做的:

  1. 在讀爲write.c,有一個file_system_wrapper功能,即調用相應的處理函數依賴於FD的文件類型(EXT2/EXT3 /插座/ ..)
  2. 在socket.c中,有一個socket_type_wrapper函數;調用相應的套接字處理函數取決於套接字的類型(ipv4,ipv6,atm others)
  3. 在socket_ipv4.c中,有一個protocol_type包裝函數;即調用相應協議處理函數取決於協議tpye(udp/tcp)
  4. 在tcp_ip4.c;有tcp_sendmsg,並且在寫入tcp ipv4類型的FD時會調用此函數。

希望這清楚了, 感謝, 後城