我很好奇,但为什么网络接口不在 /dev 中?是否还有其他类型的设备未表示为 /dev 下的节点?
答案1
在许多设备上,主要操作是将字节从计算机发送到外设,或者从计算机上的外设接收字节。此类设备与管道类似,并且工作良好字符设备。对于非读写操作(例如串行线路上的流量控制),设备提供称为读写控制。
有些设备非常类似于常规文件:它们由有限数量的字节组成,并且您在给定位置写入的内容稍后可以从同一位置读取。这些设备被称为块设备。
网络接口更加复杂:它们读取和写入的不是字节而是数据包。虽然仍然可以使用 和 的常用接口read
,write
但这会很尴尬:大概每次调用write
都会发送一个数据包,每次调用read
都会接收一个数据包(如果缓冲区太小而无法容纳数据包,数据包将会丢失)。
网络接口可以作为仅提供ioctl
.事实上,某些 UNIX 变体就是这么做的,但 Linux 不是这么做的。这种方法有一些优点;例如,在 Linux 上,网络接口可以利用乌德夫。但优点有限,所以一直没有做。
大多数与网络相关的应用程序并不关心单独的网络接口,它们在更高的级别上工作。例如,Web 浏览器想要建立 TCP 连接,而 Web 服务器想要侦听 TCP 连接。为此,有用的是用于高级网络协议的设备,例如
{ echo $'GET http://www.google.com/ HTTP/1.0\r';
echo $'Host: www.google.com\r';
echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80
事实上,ksh 和 bash 为 TCP 和 UDP 客户端提供了这样的接口。然而,一般来说,网络应用程序比文件访问应用程序更复杂。虽然大多数数据交换是通过类似于read
和 的调用进行的write
,但建立连接需要的信息不仅仅是文件名。例如,监听 TCP 连接需要两步:第一步在服务器开始监听时执行,第二步在每次客户端连接时执行。这些额外的步骤不太适合文件 API,这也是网络拥有自己的 API 的主要原因。
另一类在 Linux 上通常没有条目/dev
(但在其他一些 UNIX 变体上有)的设备是视频适配器。原则上,简单的视频适配器可以公开为帧缓冲区设备,可以是由代表每个像素颜色的块组成的块设备。加速视频适配器可以表示为应用程序向其发送命令的字符设备。在这里,设备接口的缺点是速度慢:显示应用程序(实际上是 X 服务器)在显示任何内容时都需要进行内核调用。相反,X 服务器主要直接写入视频适配器的内存,因为它速度更快。
答案2
/sys/class/net
您可以在目录中找到它。它是到其他文件的符号链接/sys/device/../../
,以下是我的虚拟机(Linux内核3.10)的输出。并且可以使用命令udevadm info <filename>
查看其属性
lrwxrwxrwx. 1 root root 0 Apr 3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
答案3
AT&T/Solaris 进行 TCP/IP 网络的“传输级接口”(TLI) 方式具有特殊文件,例如“/dev/tcp”或“/dev/udp”。程序员打开该特殊文件以获取适当协议族的套接字。我认为这就是为什么在 Solaris 上编译使用套接字的程序时必须有“-lnsl”的原因:在它的下面都是 TLI。
答案4
虽然传统上 Linux 尚未完全兼容 posix,更不用说遵循任何类型的 Open Group 标准(可能除了 LSB)。人们曾尝试将更多 UNIX 功能移植到 Linux 中。
Glendix 就是这样一个项目,它提供了 Plan9 的 /net 虚拟文件系统的端口,它允许您按照您的描述进行操作。