每天花一分鐘,學習一下linux 之 socket 的原理

這次接著寫關於linux 套接口的相關知識,我們知道,有這麼一句話,說的是在linux上一切皆文件,說白了,linux上的很多子系統都可以像操作文件一樣的使用它們,同理,linux的socket也是一樣的道理。

Linux為了能使socket的相關操作和文件IO一樣,linux專門提供了套接口文件,用一個數據結構來表示,即socket_file_ops,進程在創建套接口時,可以將進程的file指針指向socket_file_ops,這樣進程對該file的操作,就全都轉化為socket的操作,結構如下所示:

每天花一分鐘,學習一下linux 之 socket 的原理

圖1

可以看到,這個數據結構裡面有讀寫函數,當進程調用poll函數時,用戶態切換到內核態後,調用的是內核函數sock_poll,sock_file_ops可以認為是用戶態操作socket的跳轉表,也正是由於有了這張跳轉表,才使得用戶可以像操作文件一樣,操作套接口。

當用戶態進程調用socket時,返回一個文件描述符,也就是用戶是通過文件描述符來訪問套接口的,那麼為了能夠訪問套接口,需要將文件描述符和套接口進行綁定操作,在linux內核中進行綁定的函數是sock_map_fd,函數如下:

每天花一分鐘,學習一下linux 之 socket 的原理

圖2

大家可以看到,該函數首先調用 sock_alloc_fd 來分配描述符,和struct file 結構,然後調用 sock_attach_fd 來進行file 和 sock的綁定,最後通過fd_install來將進程與struct file 的綁定,這樣進程就可以通過 fd 來找到 struct file,找到了struct file 也就找到了 socket。

下面來看看sock_attach_fd的函數,如下所示:

每天花一分鐘,學習一下linux 之 socket 的原理

圖3

上圖是sock_attach_fd的實現,大家只看其中一行就行,也就是397行的代碼,file->private_data=sock,是將sock結構賦值給file的私有指針,看完這行代碼是不是覺得恍然大悟,說白了,綁定關係,就是這一行做的。

那麼進程到socket的映射關係如下所示:

每天花一分鐘,學習一下linux 之 socket 的原理

圖4

就寫到這裡吧,謝謝。


分享到:


相關文章: