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


51
$ 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------平均的链接,这是什么ccrw--w---- 呢?

3
回答#3,c代表字符device或character special。b代表块特殊
felixphew 2014年

Answers:


77

下面的几乎所有文件/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下不再如此,但是此详细信息仅对设备驱动程序编写者重要。


谢谢!通过“设备文件的含义由其编号决定”,您的意思是它的文件描述符吗?
蒂姆

@Tim:不,数字会出现在ls -l列表中,您通常会在日期之前找到文件的大小,例如brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→该设备为大8,小0。实际上,设备编号并不经常出现,我只是提到他们说是什么使设备成为设备(最重要的是,不是文件名)。文件描述符号仅在特定过程中具有含义。
吉尔(Gilles)'所以

不,在Linux上打开/dev/stdin(=> /proc/self/fd/0)与复制标准输入的效果不同。要看到差距,su - non_root_user,然后exec 5</dev/stdin将失败,出现“权限被拒绝”,但exec 5<&0一定会成功。它不仅是新的FD将与不同的标志被打开,有关文件对象(“打开文件记述一切重刑在POSIX行话”)将是不同的(文件指针偏移量,非/阻塞模式等)。
mosvy,

14
  1. 是的-直接或作为符号链接- /dev/就是为了这个目的。
  2. 出于各种目的:有时为了命名方案之间的兼容性,有时对于工作环境是必要的-如的示例/dev/stdin。这并没有指向静态/dev/pts/2或任何其他-只需切换到另一端,你会看到。/dev/stdin是您当前终端会话的标准输入。这也是为什么它需要成为符号链接的一个例子。
  3. 请参阅man mknodinfo coreutils 'mknod invocation'。通常,c代表角色设备类型。

3
“当前终端会话的标准输入”有点模棱两可。/dev/stdin指将打开它的过程的标准输入。其中的所有内容都是与/proc/$pid流程相关的数据,/proc/self是一种指向流程自己的数据的魔术符号链接。
斯蒂芬·吉梅内斯

11

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

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

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

对于您的第二个问题,请参考rozcietrzewiacz的上述答案。


1
“设备驱动程序简介”链接似乎已损坏。
Slothworks,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.