it-swarm.cn

了解/ 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. 如果lrwx------中的l是链接,则crw--w----中的c是什么意思?
55
Tim

/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)或运行无输入的命令(</dev/null)时,在Shell脚本中通常很方便。其他常见的示例是/dev/zero(它返回空字节和无限/dev/urandom (无限返回随机字节)。

一些设备文件的含义取决于访问它的过程。例如,/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是在Linux下指向/dev/sr0的符号链接;都指定第一个CD设备。符号链接的另一个原因是组织性:在Linux下,您会在多个位置找到硬盘和分区:/dev/sda/dev/sda1以及朋友(每个磁盘由任意字母指定,并且分区根据分区布局),/dev/disk/by-id/*(由唯一的序列号指定的磁盘),/dev/disk/by-label/*(具有文件系统的分区,由人为选择的标签指定);和更多。当通用设备名称可以是多个名称之一时,也可以使用符号链接。例如,如果您有两个CD读取器,而第二个是默认的DVD阅读器,则/dev/dvd可能是/dev/sr0的符号链接,或者可能是/dev/sr1的链接。

最后,由于传统原因,您可能在/dev下找到一些其他文件。您不会在每个系统上都找到相同的东西。在大多数的ICE上,/dev/log套接字 ,程序用来发出日志消息。 /dev/MAKEDEV是在/dev中创建条目的脚本。在现代Linux系统上,/dev/中的条目是由 udev 自动创建的,而不是MAKEDEV

¹实际上在Linux下不再如此,但是此详细信息仅对设备驱动程序编写者重要。

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

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

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

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

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

11
rulingminds