Linux 内核为绑定到路径名的 Unix 域套接字创建一个文件。
Linux 内核是否为 Internet 域套接字创建文件?
答案1
不,不是硬盘驱动器或其他块设备上的文件。
如果你看套接字.c在Linux源代码中,你会看到它为套接字创建了一个inode,但是数据在sockfs 文件系统,它是内核本身内的虚拟文件系统,空间是通过 kmalloc 类型的函数分配的。从这个意义上说,套接字是驻留在内存中的匿名文件。
这又回到了“Unix 中一切都是文件”的概念,这是一种设计模式,专注于让通用实用程序执行与真实物理介质上的文件类似的相同功能。作为莱纳斯·托瓦尔兹指出:
“一切都是文件”的全部要点并不是你有一些随机的文件名(事实上,套接字和管道表明“文件”和“文件名”彼此无关),而是你可以使用通用的事实操作不同事物的工具。
因此,套接字具有 inode 来进行类似文件的访问,但不存在于物理文件系统上。
但是,请注意,存在 Unix 域套接字,它们是用于进程网络的 IPC 类型对象,并且驻留在磁盘文件系统上。
答案2
Linux 内核为绑定到路径名的 Unix 域套接字创建一个文件。
好的。
Linux 内核是否为 Internet 域套接字创建文件?
不会。将套接字绑定到 IP 地址+端口不会合成路径名。它不会在您可以看到的地方创建文件。
bind()
在AF_INET
/AF_INET6
套接字上不会在任何物理文件系统上创建任何文件。该bind()
调用不会在任何内置虚拟文件系统上生成文件。 (当然,您可以编写自己的 FUSE 文件系统,它netstat -46
以某种方式进行模仿,以便创建一个新文件)。