socket与文件描述符
生活随笔
收集整理的這篇文章主要介紹了
socket与文件描述符
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在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)
{
????struct socket?*sock;
????int?err,?fput_needed;
????int?somaxconn;
? ? /* 通過文件描述符獲得 kernel socket結構, 并且增加此結構的引用計數 */ ? ? sock?=?sockfd_lookup_light(fd,?&err,?&fput_needed);
????if?(sock)?{
? ? ? ? /* 進行檢測,看看是否滿足系統設計的需求,功能上不重要 */ ????????somaxconn?=?sock_net(sock->sk)->core.sysctl_somaxconn;
????????if?((unsigned)backlog?>?somaxconn)
????????????backlog?=?somaxconn;
? ? ? ? /* 檢測此調用是否安全 */ ????????err?=?security_socket_listen(sock,?backlog);
? ? ? ? /* 執行具體的listen操作,TCP啊,或者是其他網絡協議等等,這個ops是在socket時候綁定的 */ ????????if?(!err)
????????????err?=?sock->ops->listen(sock,?backlog);
? ? ? ? /* 減少kernel socket的引用計數 */ ????????fput_light(sock->file,?fput_needed);
????}
????return?err;
}
上面就是一個典型的調用listen的內核操作。
在socket層內核完成的就是一個interface功能,或許也可以叫做橋接模式(bridge pattern)。
這就是我對socket及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結構,然后在進行對應的操作。
在socket層內核完成的就是一個interface功能,或許也可以叫做橋接模式(bridge pattern)。
這就是我對socket及Linux文件描述符的理解。
總結
以上是生活随笔為你收集整理的socket与文件描述符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态存储和静态存储区域区别
- 下一篇: 关于创业:希望有人在N年前就告诉我的一些