Linux 编程接口说
56.5.5 连接终止:close()
终止流套接字连接的常用方法是调用 close()。如果多个文件描述符引用同一个套接字,则连接终止时所有描述符已关闭。
内核为套接字使用什么数据结构?它们与常规文件相似吗:
- 文件描述符表
- 文件描述表
- 虚拟节点表?
“多个文件描述符引用同一个套接字”与“多个文件描述符引用同一个套接字描述”的意思相同吗?
“多个文件描述符引用同一个套接字”是如何创建的?它是由dup()
某些套接字特定的函数创建的吗?
我之前见过套接字的两种不同定义:
套接字与端口相同(TCP端口、UDP端口)
TCP套接字由一个连接来标识,因此多个套接字可以对应同一个TCP端口。 (我猜这是Socket API中使用的定义)
“多个文件描述符引用同一个套接字”中的引用使用了哪个套接字定义?
答案1
简单的答案是记住文件描述符只是对实际套接字的引用,您可以有多个文件描述符引用同一个套接字。当最后一个引用被删除时,引用计数用于终止套接字。
所以,是的,您可以使用dup(2)
套接字文件描述符。
更长的解释是文件描述符只是内核 inode 的用户空间句柄。内核struct inode
有一个指向内核的指针,struct socket
它是一个更高级别的通用套接字接口。该结构将有一个指向较低级别的指针,struct sock
即实际的 tcp/ip 套接字。请记住,您可以拥有其他地址系列的套接字。请注意,这个解释仍然有些简化。
为了回答你的最后一个问题,这两个定义对于引用都是正确的。
这篇博文实际上很好地解释了创建套接字和分配文件描述符的部分过程:https://ops.tips/blog/how-linux-creates-sockets/