File-Descriptors
“多個文件描述符引用同一個套接字”是如何創建的?
Linux 程式介面說
56.5.5 連接終止:close()
終止流套接字連接的常用方法是呼叫 close()。如果多個文件描述符引用同一個套接字,則在關閉****所有描述符時終止連接。
核心對套接字使用什麼資料結構?它們是否類似於正常文件:
- 文件描述符表
- 文件描述表
- 虛擬節點表?
“多個文件描述符引用同一個套接字”是否與“多個文件描述符引用同一個套接字描述”相同?
“多個文件描述符引用同一個套接字”是如何創建的?它是由某些特定於套接字的函式創建的
dup()
還是由某些特定於套接字的函式創建的?我之前見過兩種不同的套接字定義:
- 套接字與埠相同(TCP埠,UDP埠)
- 一個 TCP 套接字由一個連接標識,因此多個套接字可以對應同一個 TCP 埠。(我猜這是 Socket API 中使用的定義)
引用在“多個文件描述符引用同一個套接字”中使用了哪個套接字定義?
簡單的答案是記住文件描述符只是對實際套接字的引用,您可以有多個文件描述符引用同一個套接字。引用計數用於在刪除最後一個引用時終止套接字。
所以,是的,您可以
dup(2)
使用套接字文件描述符。更長的解釋是文件描述符只是核心 inode 的使用者空間句柄。核心
struct inode
有一個指向核心的指針,核心struct socket
是一個更高級別的通用套接字介面。該結構將有一個指向較低級別的指針,struct sock
即實際的 tcp/ip 套接字。請記住,您可以擁有其他地址系列的套接字。注意,這個解釋仍然有些簡化。要回答您的最後一個問題,關於報價,這兩個定義都是正確的。
這篇博文實際上很好地解釋了創建套接字和分配文件描述符的部分過程:https ://ops.tips/blog/how-linux-creates-sockets/