下面的几乎所有文件/dev都是设备文件。读取和写入常规文件会将数据存储在磁盘或其他文件系统上,而访问设备文件则与内核中的驱动程序进行通信,而驱动程序通常又与一块硬件(硬件设备,因此称为名称)进行通信。
设备文件有两种类型:块设备(由表示b为输出中的第一个字符ls -l)和字符设备(由表示c)。块设备和字符设备之间的区别不是完全通用的。块设备就像磁盘一样,其行为类似于固定大小的大文件:如果您在某个偏移量处写入一个字节,然后在该偏移量处从设备读取数据,则会将该字节取回。字符设备几乎与其他任何东西一样,在其中写入一个字节会立即产生作用(例如,它在串行线上发出),而读取一个字节也会产生一些立即作用(例如,从串行端口读取)。
设备文件的含义取决于其编号,而不取决于名称(名称与应用程序有关,而与内核无关)。该数字实际上是两个数字:主要数字表示负责此设备的驱动程序,次要数字允许驱动程序驱动多个设备¹。这些数字出现在ls -l列表中,通常可以在其中找到文件大小。例如brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→该设备为大号8,小号0。
下的某些设备文件/dev与硬件设备不对应。每个Unix系统上都有一个/dev/null; 对其进行写入无效,而对其进行读取则永远不会返回任何数据。当您想忽略命令(>/dev/null)的输出或运行无输入的命令()时,在shell脚本中通常很方便</dev/null。其他常见示例是/dev/zero(返回无穷大字节infinitum)/dev/urandom(返回随机无数字节ad infinitum)。
一些设备文件的含义取决于访问它的过程。例如,/dev/stdin指定当前过程的标准输入;open from与打开作为流程标准输入打开的原始文件的效果大致相同。类似地,/dev/tty指定该进程连接到的终端。在Linux下,如今,/dev/stdin和朋友不是作为字符设备实现的,而是作为符号链接到更通用的机制的,该机制允许引用每个文件描述符(与传统方法中的0、1和2相对);例如/dev/stdin是的符号链接/proc/self/fd/0。请参阅/ dev / fd与/ proc / self / fd /有何关系?。
您可以在下找到许多符号链接/dev。发生这种情况的原因可能是历史原因:设备文件已从一个名称移到另一个名称,但是某些应用程序仍使用旧名称。例如,/dev/scd0是/dev/sr0Linux下的符号链接;都指定第一个CD设备。符号链接的另一个原因是组织性:在Linux下,您会在几个地方找到硬盘和分区:/dev/sda和/dev/sda1和朋友(每个磁盘由任意字母指定,并且根据分区布局进行分区),/dev/disk/by-id/*(由磁盘指定。唯一的序列号)/dev/disk/by-label/*(带有文件系统的分区,由人为选择的标签指定);和更多。当通用设备名称可以是多个名称之一时,也可以使用符号链接。例如/dev/dvd可能是的符号链接/dev/sr0,或者/dev/sr1如果您有两个CD读取器,而第二个是默认DVD读取器,则可能是一个链接。
最后,由于/dev传统原因,您可能在下找到一些其他文件。您不会在每个系统上都找到相同的东西。在大多数unice上,/dev/log是程序用来发出日志消息的套接字。/dev/MAKEDEV是在中创建条目的脚本/dev。在现代Linux系统上,indev 条目/dev/由udev自动创建,已过时MAKEDEV。
¹实际上在Linux下不再如此,但是此详细信息仅对设备驱动程序编写者重要。