每个套接字都有文件吗?


21

UNIX世界中的“一切都是文件”。

以上一句很有名。运行时echo "hello programmer" >> /dev/tty1,我可以在TeleType 1 ... 上观看给定的字符串。

每个文件是什么?在哪里socket?假设我的朋友连接到我的PC,其IP为h.h.h.h,我如何访问相应的文件?可能吗?


3
在这方面,套接字API实际上是与“ Unix策略”的偏差,因为它最初来自BSD。请注意,Bell Labs总是有Plan 9, “ Unix比Unix多” –甚至网络和图形API也都在那里。
ntoskrnl 2014年

在Plan 9论文中提到了相当数量的套接字和进程,主要讨论的是UNIX模型出了什么问题。
凌晨

Answers:


9

男子7 Unix:

AF_UNIX(也称为AF_LOCAL)套接字系列用于在同一台计算机上的进程之间进行有效的通信。传统上,UNIX域套接字可以不命名,也可以绑定到文件系统路径名(标记为套接字类型)。Linux还支持独立于文件系统的抽象名称空间。

即,不是每个套接字都可以看作一个文件(在“没有文件名的情况下没有文件”的意义上)。

但是有些文件带有套接字列表(例如/proc/net/tcp);但是,“所有东西都是文件”的含义并不完全相同。


38

套接字一个文件。但并非所有文件都有名称。以下是一些没有名称的文件的示例:

  • 曾经有名称的任何文件,现在已被删除,但仍由程序打开。
  • 未命名的管道,例如由|shell运算符创建的管道
  • 大多数套接字:任何Internet套接字或不在文件系统名称空间中的Unix套接字(可以在抽象名称空间中或未命名)。

诸如未命名管道或套接字之类的文件由进程创建,并且只能在该进程或随后创建的子进程中进行访问。(这不是完全正确的:打开管道或套接字(或任何其他文件)的进程可以通过Unix套接字将其传输到其他进程;这被称为文件描述符传递。)

可以使用该名称打开具有名称(无论是在文件系统中还是抽象名称中)的套接字。可以从具有适当连接性的任何计算机上远程打开(或更精确地连接到)网络插座。


这是正确的答案。
jforberg

4
/proc/<pid>/fd/*并且/proc/net/*可能是有趣
n611x007

请接受此答案。恕我直言,要准确得多。
user1202136

13

每个套接字的文件在哪里?

“一切”都是夸张的。这不是严格的策略,使用文件系统作为接口只是一种惯例,因为文件系统访问是系统调用的同义词(即文件系统实际上是与内核的接口,因此为各种事物提供了方便的格式) 。其他操作系统没有充分利用此功能,因此被认为是一项独特的功能。

正如Hauke Laging所提到的,“ unix本地”套接字与命名管道一样具有文件节点(请参阅参考资料man fifo)。但是,Internet协议套接字(用于网络通信)却没有。相反,它们在用户空间中与端口号关联。请注意,单个端口上的服务器套接字将多个客户端分别连接到各自的套接字(单个unix本地套接字文件也可以通过这种方式与服务器一起使用,这意味着可能有多个套接字与同一文件地址相关联)实际上,它们在代码中是通过单独的数字文件描述符进行单独标识的

因此,从这个意义上讲,所有套接字非常类似于文件,并且在中具有链接/proc/[pid]/fd/。您甚至可以调用readlink()此inode并获得一种特殊的文件名,该文件名可用于命令行工具,如lsof,我相信;同样,您可以通过获得有关套接字描述符的信息fstat()


您的意思是“在用户空间中由他们的inode标识”?并非每个套接字都有一个端口号,并且同一端口号可以有多个套接字(尽管没有意义)。
Hauke Laging

@HaukeLaging:好点。从第二段开始,我进行了编辑以使这一点更加清楚。
goldilocks 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.