Per*_*ulf 28 kernel files socket
UNIX 世界中的“一切都是文件”。
上面这句话很有名。当我运行时echo "hello programmer" >> /dev/tty1
,我可以在TeleType 1
...上观看给定的字符串。
每个文件是什么以及在哪里socket
?假设我的朋友连接到我的电脑,它的 IP 是h.h.h.h
,我如何访问相应的文件?是否可以?
Gil*_*il' 45
套接字是一个文件。但并非所有文件都有名称。以下是一些没有名称的文件示例:
|
shell 操作符创建的管道。诸如未命名管道或套接字之类的文件由进程创建,并且只能在该进程或随后创建的子进程中访问。(这并不完全正确:打开管道或套接字(或任何其他文件)的进程可以通过 Unix 套接字将其传输到其他进程;这称为文件描述符传递。)
可以使用该名称打开具有名称(无论是在文件系统中还是在抽象中)的套接字。网络套接字可以从任何具有适当连接性的机器远程打开(或更准确地说是连接到)。
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
);不过,这并不完全是“一切都是文件”的意思。