$ 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
- 我想知道它及其子目录下的所有文件是否
/dev
都是设备的文件描述符? - 为什么彼此之间有这么多链接?例如,
/dev/fd/0
、/dev/stdin
、/proc/self/fd/0
都是指向 的链接/dev/pts/2
。 - 如果
l
在lrwx------
平均链接中,则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
- 是的 - 无论是直接还是作为符号链接 - 这就是目的
/dev/
。 - 出于各种目的:有时是为了命名方案之间的兼容性,有时是工作环境所必需的 - 正如
/dev/stdin
.这确实不是观点静态地或/dev/pts/2
任何其他 - 只需切换到另一个终端,您就会看到。/dev/stdin
是你的标准输入当前的终端会话。这也是为什么它需要是符号链接的一个例子。 - 参见
man mknod
和info coreutils 'mknod invocation'
。一般来说,c
代表字符设备类型。
答案3
对于你的第一个问题,它们不是文件描述符,它们是设备文件。 (又名“开发节点”)
这些文件与使用主设备号和次设备号处理设备的驱动程序绑定。 (例如,ls
输出中的“136, 2”指的是绑定到主设备号 136 的设备驱动程序,并指定由该驱动程序处理的设备#2。)
如果是设备文件,输出的第一个字母ls -l
是设备的类型。如果它是“c”,则它是字符设备,如果它是“b”,则它是块设备。
对于你的第二个问题,请参考上面rozcietrzewiacz的回答。