Gee*_*eek 86 devices block-device files
字符特殊文件和块特殊文件与类 Unix 系统中的常规文件有何不同?为什么它们分别被称为“字符特殊”和“块特殊”?
Gil*_*il' 108
当程序从文件读取或写入数据时,请求会转到内核驱动程序。如果文件是常规文件,则数据由文件系统驱动程序处理,并且通常存储在磁盘或其他存储介质上的区域中,从文件中读取的数据是先前写入该位置的数据。还有其他文件类型会发生不同的事情。
当数据被读取或写入设备文件时,请求由该设备的驱动程序处理。每个设备文件都有一个关联的编号,用于标识要使用的驱动程序。设备如何处理数据是它自己的事情。
块设备(也称为块特殊文件)通常的行为与普通文件非常相似:它们是一个字节数组,在给定位置读取的值是最后一次写入那里的值。来自块设备的数据可以缓存在内存中并从缓存中读回;写入可以被缓冲。块设备通常是可查找的(即在文件中存在应用程序可以更改的位置概念)。“块设备”这个名字来源于这样一个事实,即相应的硬件通常一次读取和写入整个块(例如硬盘上的一个扇区)。
字符设备(也称为字符特殊文件)的行为类似于管道、串行端口等。对它们进行写入或读取是一个即时操作。驱动程序如何处理数据是它自己的事情。将字节写入字符设备可能会导致它显示在屏幕上,输出到串行端口,转换为声音,......从设备读取字节可能会导致串行端口等待输入,可能返回随机byte ( /dev/urandom), ... “字符设备”这个名字来自于每个字符都被单独处理的事实。
有关更多信息,请参阅维基百科和了解 /dev 及其子目录和文件。
它们指向一个驱动程序并且可以由[mknod][1]. 查看其手册页,似乎块设备已缓冲而字符设备未缓冲。块设备有一个“块大小”,表示可访问的块的大小。(对于存储设备,块大小通常在 512 B 和 4 KiB 之间)存储设备和内存通常作为块设备访问,而串行端口和终端等设备通常作为字符设备访问。
它们通常在 /dev 中找到(并且不能在使用nodev选项(或其等效项)安装的分区上运行)
在ls -l通常找到大小的位置显示两个逗号分隔的设备编号。这些是主要和次要数字,指向驱动程序。它们的类型也在ls -l输出的权限列中指示为“c”或“b” 。
/dev 可以通过多种方式填充。在最近的 Linux 内核版本上,通常使用udev,在 Solaris 上它包含指向 /devices 的链接,这是一个虚拟的 devfs 文件系统。
Unix/Linux 中的文件类型:普通或常规文件、目录、设备(特殊)文件、链接、命名管道和套接字。
\n\n设备(特殊)文件是设备驱动程序的接口,它像普通文件一样出现在文件系统中。它们是字符设备、块设备和伪设备(如/dev/null)。
字符驱动一次会发送一个字符,因此需要携带少量负载,但要发出很多请求。块驱动意味着您获得大量字符(数据)集合,因此您有更大的负载,但必须执行更少的请求。类比:基本上与按瓶或按板条箱购买苏打水相同。
\n\n当您知道可以预期有多少数据时,块驱动非常有用,磁盘上的文件通常就是这种情况。
\n\n当您不知道数据何时停止时,字符驱动更实用,因此您可以保持数据运行直到不再有字符通过。例如,互联网连接,因为您不知道将从服务器接收的数据流的大小。
\n\n例如:
\n\n| 归档时间: |
|
| 查看次数: |
109230 次 |
| 最近记录: |