socket與檔案描述符

2021-07-11 08:32:23 字數 956 閱讀 1202

在linux程式設計時,無論是在操作檔案還是網路操作時都能夠通過檔案描述符來read或者write。之前在沒有接觸c++的時候,不懂物件導向的那套東西。自從學習了c++以及物件導向的一些知識以後突然對linux這套檔案描述符有了稍微深刻的認識。

怎麼說呢,linux這一套檔案機制就相當於物件導向裡面的多型,拿到乙個檔案描述符都可以進行read或者write。但是具體的read和write卻跟對應檔案描述符的具體實現不同。比如socket的就是走網路,普通檔案的就是走磁碟io。

下面一張uml類圖大概表現出了linux檔案描述符的大概意思:

當然,為了將不同的型別的i/o與對應的檔案描述符繫結,則是需要不同的初始化函式的。在c++中有建構函式跟編譯器幫助搞定,在c函式裡只能自己動手豐衣足食了。

普通檔案就通過open函式,指定對應的檔案路徑,作業系統通過路徑能夠找到對應的檔案系統型別,如ext4啊,fat啊等等。

如果是網路呢,就通過socket函式來初始化,socket函式就通過(domain, type, protocol)來找到對應的網路協議棧,比如tcp/ip,unix等等。

整個linux 檔案系統的結構差不多就這個意思,socket跟他繫結也是為了統一介面。

所以網路相關的呼叫,如connect, bind等等,第一步基本上就是通過檔案描述符找到對應的核心socket結構,然後在進行對應的操作。

syscall_define2(listen,

int, fd,

int, backlog)

return err;}

上面就是乙個典型的呼叫listen的核心操作。

在socket層核心完成的就是乙個inte***ce功能,或許也可以叫做橋接模式(bridge pattern)。

這就是我對socket及linux檔案描述符的理解。

Socket描述符解釋

因為套接字api最初是作為unix作業系統的一部分而開發的,所以套接字api與系統的其他i o裝置整合在一起。特別是,當應用程式要為網際網路通訊而建立乙個套接字 socket 時,作業系統就返回乙個小整數作為描述符 descriptor 來標識這個套接字。然後,應用程式以該描述符作為傳遞引數,通過呼...

mysql 檔案描述符 檔案描述符

toc 首先,linux的世界裡一切皆為檔案,無論是裝置還是乙個socket連線。檔案又可分為 普通檔案 目錄檔案 鏈結檔案和裝置檔案。檔案描述符 file descriptor 是核心為了高效管理已被開啟的檔案所建立的索引,其是乙個非負整數 通常是小整數 用於指代被開啟的檔案,所有執行i o操作的...

檔案描述符

檔案描述符 是個很小的正整數,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。檔案描述符的優點 相容posix標準,許多 linux 和unix 系統呼叫都依賴於它。檔案描述符的缺點 不能移植到unix以外的系統上去,也不直觀。基於檔案描述符的輸入輸出函式 open 開啟乙個檔案...