Tim*_*Tim 66 linux file-descriptors devices
$ 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
Run Code Online (Sandbox Code Playgroud)
/dev及其子目录下的所有文件都是设备的文件描述符?/dev/fd/0、
/dev/stdin、/proc/self/fd/0都是指向 的链接/dev/pts/2。lin lrwx------mean link,cincrw--w----
是什么意思?Gil*_*il' 95
下面几乎所有的文件/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(它返回空字节和无限)/dev/urandom(它返回随机字节和无限)。
一些设备文件的含义取决于访问它的进程。例如,/dev/stdin指定当前进程的标准输入;打开 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 系统上,条目/dev/是由udev自动创建的,过时了MAKEDEV。
¹ 这实际上在 Linux 下不再适用,但此细节仅对设备驱动程序编写者很重要。
roz*_*acz 14
/dev/目的。/dev/stdin. 这并没有指向静态到/dev/pts/2或任何其他-只需切换到另一端,你会看到。/dev/stdin是当前终端会话的标准输入。这也是为什么它需要是符号链接的一个例子。man mknod和info coreutils 'mknod invocation'。通常,c代表字符设备类型。小智 11
对于您的第一个问题,它们不是文件描述符,而是设备文件。(又名“开发节点”)
这些文件与使用主要和次要编号处理设备的驱动程序绑定。(例如,ls输出中的“136, 2”指的是绑定到主编号 136 的设备驱动程序,并指定由该驱动程序处理的设备 #2。)
ls -l在设备文件的情况下,输出的第一个字母是设备的类型。如果是'c',则是字符设备,如果是'b',则是块设备。
对于您的第二个问题,请参阅 rozcietrzewiacz 的上述答案。
| 归档时间: |
|
| 查看次数: |
58873 次 |
| 最近记录: |