了解 /dev 及其子目录和文件

了解 /dev 及其子目录和文件
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. 我想知道它及其子目录下的所有文件是否/dev都是设备的文件描述符?
  2. 为什么彼此之间有这么多链接?例如,/dev/fd/0/dev/stdin/proc/self/fd/0都是指向 的链接/dev/pts/2
  3. 如果llrwx------平均链接中,则c意味着什么crw--w----

答案1

几乎所有的文件/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:写入它没有任何效果,读取它也不会返回任何数据。在 shell 脚本中,当您想要忽略命令 ( ) 的输出>/dev/null或运行不带输入的命令 ( </dev/null) 时,这通常很方便。其他常见的示例是/dev/zero(返回空字节无限期/dev/urandom(返回随机字节无限期)。

一些设备文件的含义取决于访问它的进程。例如,/dev/stdin指定当前进程的标准输入;打开自 与打开作为进程的标准输入打开的原始文件具有大致相同的效果。有点类似,/dev/tty指定进程连接到的终端。如今,在 Linux 下,/dev/stdin朋友们不再实现为字符设备,而是实现为更通用机制的符号链接,该机制允许引用每个文件描述符(而不是传统方法下仅 0、1 和 2);例如/dev/stdin是到 的符号链接/proc/self/fd/0。看/dev/fd 与 /proc/self/fd/ 有何关系?

您将在 下找到许多符号链接/dev。发生这种情况的原因可能是历史原因:设备文件已从一个名称移至另一个名称,但某些应用程序仍使用旧名称。比如Linux下/dev/scd0是符号链接;/dev/sr0两者都指定第一个 CD 设备。符号链接的另一个原因是组织:在 Linux 下,您会在几个地方找到硬盘和分区:/dev/sda/dev/sda1朋友(每个磁盘由任意字母指定,并根据分区布局进行分区),/dev/disk/by-id/*(由唯一的序列号),/dev/disk/by-label/*(具有文件系统的分区,由人工选择的标签指定);和更多。当通用设备名称可能是多个设备名称之一时,也会使用符号链接;例如,/dev/dvd可能是 的符号链接,或者如果您有两个 CD 阅读器,而第二个是默认的 DVD 阅读器,则/dev/sr0可能是 的链接。/dev/sr1

/dev最后,出于传统原因,您可能会在 下找到一些其他文件。您不会在每个系统上找到相同的内容。在大多数 unice 上,/dev/log插座程序用来发出日志消息。/dev/MAKEDEV是一个在 中创建条目的脚本/dev。在现代 Linux 系统上,条目/dev/是由以下命令自动创建的乌德夫,过时的MAKEDEV

¹ 在 Linux 下,这实际上已不再适用,但这个细节仅对设备驱动程序编写者来说很重要。

答案2

  1. 是的 - 无论是直接还是作为符号链接 - 这就是目的/dev/
  2. 出于各种目的:有时是为了命名方案之间的兼容性,有时是工作环境所必需的 - 正如/dev/stdin.这确实不是观点静态地/dev/pts/2任何其他 - 只需切换到另一个终端,您就会看到。/dev/stdin是你的标准输入当前的终端会话。这也是为什么它需要是符号链接的一个例子。
  3. 参见man mknodinfo coreutils 'mknod invocation'。一般来说,c代表字符设备类型。

答案3

对于你的第一个问题,它们不是文件描述符,它们是设备文件。 (又名“开发节点”)

这些文件与使用主设备号和次设备号处理设备的驱动程序绑定。 (例如,ls输出中的“136, 2”指的是绑定到主设备号 136 的设备驱动程序,并指定由该驱动程序处理的设备#2。)

如果是设备文件,输出的第一个字母ls -l是设备的类型。如果它是“c”,则它是字符设备,如果它是“b”,则它是块设备。

对于你的第二个问题,请参考上面rozcietrzewiacz的回答。

相关内容