今天,告訴你,linux內核中進程,文件描述符,套接口的關係

在前面我們說過,linux系統一切皆文件,網絡編程,也可以像操作文件一樣進行處理,當某個進程創建完套接口後,就可以通過文件描述符進行讀寫數據,因此linux內核就得提供,通過文件描述符來獲取套接口的操作函數,而操作函數就是sockfd_lookup_light,函數如下所示:

今天,告訴你,linux內核中進程,文件描述符,套接口的關係

圖1

參數解釋如下:

fd: 文件描述符。

err: 錯誤的操作碼,當函數執行出錯時,將操作碼放到err中,將其帶回。

fput_needed:引用計數相關的參數。

462行: 調用fget_light內核函數,根據文件描述符fd獲取文件描述符的結構指針struct file。

463-469:如果成功的返回了struct file指針,則根據file指針獲取網絡套接口sock,即 struct socket。

下面看看sock_from_file的實現:

今天,告訴你,linux內核中進程,文件描述符,套接口的關係

圖2

419行:根據文件操作表的函數指針來進行判斷,如果file的文件操作表的指針是網絡的文件操作表,則返回file->private_data的指針,因為,file->private_data的值是在sock_attach_fd函數中被設置的,這個不清楚的話,可以看我之前發的文章。

進程和文件描述符以及和套接口的關係,我給整理了一下結構圖,如下所示:

今天,告訴你,linux內核中進程,文件描述符,套接口的關係

圖3

Linux內核中,是通過current->files->fd_array[fd]就可以訪問當前進程fd所對應的文件描述符的實例,在struct file中,有兩個成員是比較重要的,一個是private_data,一個是f_op,f_op指向了struct file_operations,對於網絡文件描述符,這個結構裡存的是網絡的操作集合。

今天就寫到這裡吧,謝謝。


分享到:


相關文章: