每个套接字都有一个文件吗?

Per*_*ulf 28 kernel files socket

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

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

每个文件是什么以及在哪里socket?假设我的朋友连接到我的电脑,它的 IP 是h.h.h.h,我如何访问相应的文件?是否可以?

Gil*_*il' 45

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

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

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

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

  • `/proc/<pid>/fd/*` 和 `/proc/net/*` 可能很有趣 (4认同)

gol*_*cks 14

每个套接字的文件是什么以及在哪里?

“一切”都是夸大其词。这不是一个严格的策略,只是将文件系统用于接口只是一种常见做法,因为文件系统访问与系统调用是同义词(即,文件系统实际上是与内核的接口,因此为各种事物提供了方便的格式) . 其他操作系统没有充分利用这一点,因此它被认为是一个显着特征。

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

因此,从这个意义上说,所有套接字非常像文件,并且在/proc/[pid]/fd/. 你甚至可以调用readlink()这个 inode 并获得一种特殊类型的文件名,它在命令行工具中使用lsof,我相信;同样,您可以通过fstat().


Hau*_*ing 12

人 7 Unix:

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

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

但是有带有套接字列表的文件(例如/proc/net/tcp);不过,这并不完全是“一切都是文件”的意思。