下面的几乎所有文件/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/sr0
Linux下的符号链接;都指定第一个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下不再如此,但是此详细信息仅对设备驱动程序编写者重要。