UNIX世界中的“一切都是文件”。
以上一句很有名。运行时echo "hello programmer" >> /dev/tty1
,我可以在TeleType 1
... 上观看给定的字符串。
每个文件是什么?在哪里socket
?假设我的朋友连接到我的PC,其IP为h.h.h.h
,我如何访问相应的文件?可能吗?
UNIX世界中的“一切都是文件”。
以上一句很有名。运行时echo "hello programmer" >> /dev/tty1
,我可以在TeleType 1
... 上观看给定的字符串。
每个文件是什么?在哪里socket
?假设我的朋友连接到我的PC,其IP为h.h.h.h
,我如何访问相应的文件?可能吗?
Answers:
男子7 Unix:
AF_UNIX(也称为AF_LOCAL)套接字系列用于在同一台计算机上的进程之间进行有效的通信。传统上,UNIX域套接字可以不命名,也可以绑定到文件系统路径名(标记为套接字类型)。Linux还支持独立于文件系统的抽象名称空间。
即,不是每个套接字都可以看作一个文件(在“没有文件名的情况下没有文件”的意义上)。
但是有些文件带有套接字列表(例如/proc/net/tcp
);但是,“所有东西都是文件”的含义并不完全相同。
套接字是一个文件。但并非所有文件都有名称。以下是一些没有名称的文件的示例:
|
shell运算符创建的管道。诸如未命名管道或套接字之类的文件由进程创建,并且只能在该进程或随后创建的子进程中进行访问。(这不是完全正确的:打开管道或套接字(或任何其他文件)的进程可以通过Unix套接字将其传输到其他进程;这被称为文件描述符传递。)
可以使用该名称打开具有名称(无论是在文件系统中还是抽象名称中)的套接字。可以从具有适当连接性的任何计算机上远程打开(或更精确地连接到)网络插座。
/proc/<pid>/fd/*
并且/proc/net/*
可能是有趣
每个套接字的文件在哪里?
“一切”都是夸张的。这不是严格的策略,使用文件系统作为接口只是一种惯例,因为文件系统访问是系统调用的同义词(即文件系统实际上是与内核的接口,因此为各种事物提供了方便的格式) 。其他操作系统没有充分利用此功能,因此被认为是一项独特的功能。
正如Hauke Laging所提到的,“ unix本地”套接字与命名管道一样具有文件节点(请参阅参考资料man fifo
)。但是,Internet协议套接字(用于网络通信)却没有。相反,它们在用户空间中与端口号关联。请注意,单个端口上的服务器套接字将多个客户端分别连接到各自的套接字(单个unix本地套接字文件也可以通过这种方式与服务器一起使用,这意味着可能有多个套接字与同一文件地址相关联)实际上,它们在代码中是通过单独的数字文件描述符进行单独标识的。
因此,从这个意义上讲,所有套接字都非常类似于文件,并且在中具有链接/proc/[pid]/fd/
。您甚至可以调用readlink()
此inode并获得一种特殊的文件名,该文件名可用于命令行工具,如lsof
,我相信;同样,您可以通过获得有关套接字描述符的信息fstat()
。