我主要是好奇,但是为什么/ dev中没有网络接口?在/ dev下还有其他没有表示为节点的设备吗?
read()
和使用write()
文件时相同的方式,但是该实用程序会起作用recv()
并send()
为您做很多工作。
我主要是好奇,但是为什么/ dev中没有网络接口?在/ dev下还有其他没有表示为节点的设备吗?
read()
和使用write()
文件时相同的方式,但是该实用程序会起作用recv()
并send()
为您做很多工作。
Answers:
在许多设备上,主要操作是从计算机向外围设备发送字节,或从计算机上的外围设备接收字节。这种设备类似于管道,并且可以很好地用作字符设备。对于不进行读写的操作(例如串行线路上的流控制),该设备会提供称为ioctl的临时命令。
有些设备非常类似于常规文件:它们由有限数量的字节组成,并且以后可以从同一位置读取您在给定位置写入的内容。这些设备称为块设备。
网络接口更复杂:它们读取和写入的不是字节而是包。尽管仍然可以将常规接口与read
和一起使用write
,但这样做会很尴尬:假设每次调用write
都会发送一个数据包,而每次调用read
都会接收一个数据包(并且如果缓冲区太小而无法容纳该数据包,数据包将丢失)。
网络接口可以作为仅提供设备的设备而存在ioctl
。实际上,这是某些unix变体的功能,而Linux却没有。这种方法有一些优势。例如,在Linux上,网络接口可以利用udev。但是优点有限,这就是为什么它没有做到的原因。
大多数与网络相关的应用程序并不关心单个网络接口,而是在更高级别上工作。例如,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的主要原因。
/dev
视频适配器是另一类在Linux上通常没有条目(但在某些其他Unix变体上也没有)的设备。原则上,简单的视频适配器可以作为帧缓冲设备公开,可以是由代表每个像素颜色的块组成的块设备。加速的视频适配器可以表示为应用程序向其发送命令的字符设备。这里,设备接口的缺点是速度慢:显示应用程序(实际上是X服务器)在显示任何内容时都需要进行内核调用。相反,发生的是X服务器通常直接写入视频适配器的内存,因为它更快。
read
/ write
要么; 您可以使用mmap
映射文件和直接访问设备内存。
您可以在/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
<>
否则将被解释为标记。(您可能还希望更改名称以ASCII转录开头,因为使用简单键盘的人将难以在回答您的评论时键入姓名的第一个字符)
用于进行TCP / IP网络连接的AT&T / Solaris“传输级接口”(TLI)方法具有特殊文件,例如“ / dev / tcp”或“ / dev / udp”。程序员打开该特殊文件以获取适当协议家族的套接字。我认为这就是为什么在Solaris上编译使用套接字的程序时必须具有“ -lnsl”的原因:在这之下的全部是TLI。
/dev/tcp
和/dev/udp
,尽管大多数内核都将其禁用。
虽然传统上Linux尚未完全与posix兼容,但更不用说遵循任何种类的Open Group标准了(可能不是LSB)。已经尝试将更多的UNIX功能移植到Linux中。
Glendix是一个这样的项目,它提供了Plan9的/ net虚拟文件系统的端口,该端口允许您按照自己的描述进行操作。