2016-11-29 135 views
0

雖然努力學習socket編程,我看到了下面的代碼:什麼是文件描述符?

int sock; 
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

我通過man頁面瀏覽和發現套接字返回一個文件描述符。我試過在這裏搜索互聯網和其他類似的問題,但我不明白什麼文件描述符是真的。我必須在兩天內完成我的套接字編程課程。所以如果有人能用簡單的語言解釋文件描述符,那會很棒。

+0

建議閱讀結構化引入複雜的主題,如網絡編程。如果您能買得起一本書或可以訪問一個圖書館,請閱讀史蒂文斯在UNIX環境下的高級編程。*如果您執行了大量的網絡編程,請查看他的網絡編程書籍。手冊頁作爲參考很有用,但對於獲得整體想法很不利。 –

回答

2

有兩個相關對象:文件描述符和文件描述。人們經常混淆這兩者並認爲它們是一樣的。

文件描述符是您的應用程序中的一個整數,指的是內核中的文件描述

文件描述是內核中維護打開文件狀態(當前位置,阻塞/非阻塞等)的結構。在Linux文件descripionstruct file

POSIX open()

open()功能應建立文件和文件描述之間的連接。它將創建一個打開的文件描述指的是一個文件和一個文件描述符它指的是打開文件描述。文件描述符被其他I/O函數用來引用該文件。 path參數指向命名文件的路徑名。

open()函數應該返回一個指定文件的文件描述符,該文件描述符是該進程當前未打開的最低文件描述符。打開的文件描述是新的,因此文件描述符不應與系統中的任何其他進程共享。

0

在的Unix/Linux操作系統,一個文件描述符是用於訪問文件或其它IO(輸入/輸出)資源,諸如管或網絡套接字的抽象指示符(手柄)。 通常情況下,文件描述符會被索引到Linux/Unix操作系統中的內核維護的每個進程的文件描述符表中,然後將 索引到由所有進程打開的文件系統表中,稱爲文件表。 該表記錄了與該文件或其他資源被用於以下操作打開 「模式」(也有更多的操作)

  • 閱讀
  • 附加

以及其他可能的模式。 它還會索引到第三個稱爲inode表的表中,該表描述實際的底層文件。

1

我認爲文件描述符爲(間接的,更高級的)指針爲內核維護的不透明文件對象。

通常情況下,當您處理由庫維護的對象時,會將庫指針傳遞給您不應該解除引用和操縱自己的對象。

對於內核對象,這不僅僅是因爲你不應該自己操縱它們 - 你實際上不能這樣做,因爲它們生活在一個根本不可訪問的地址空間中。而且由於他們生活在不同的地址空間,指針並不是引用它們的有意義的方式。

您需要一個令牌或句柄,內核將內部解析爲一個在內核地址空間中有意義的指針。文件描述符是整數形式的這種令牌。

對於內核:

your_process_id + your_file_descriptor => kernels_file_object_pointer 

(或EBADF錯誤,如果一個給定的文件描述符可以不被解析爲一個文件對象指針對於給定的過程)