unix 系统中的字符特殊文件和块特殊文件是什么?

Gee*_*eek 86 devices block-device files

字符特殊文件和块特殊文件与类 Unix 系统中的常规文件有何不同?为什么它们分别被称为“字符特殊”和“块特殊”?

Gil*_*il' 108

当程序从文件读取或写入数据时,请求会转到内核驱动程序。如果文件是常规文件,则数据由文件系统驱动程序处理,并且通常存储在磁盘或其他存储介质上的区域中,从文件中读取的数据是先前写入该位置的数据。还有其他文件类型会发生不同的事情。

当数据被读取或写入设备文件时,请求由该设备的驱动程序处理。每个设备文件都有一个关联的编号,用于标识要使用的驱动程序。设备如何处理数据是它自己的事情。

块设备(也称为块特殊文件)通常的行为与普通文件非常相似:它们是一个字节数组,在给定位置读取的值是最后一次写入那里的值。来自块设备的数据可以缓存在内存中并从缓存中读回;写入可以被缓冲。块设备通常是可查找的(即在文件中存在应用程序可以更改的位置概念)。“块设备”这个名字来源于这样一个事实,即相应的硬件通常一次读取和写入整个块(例如硬盘上的一个扇区)。

字符设备(也称为字符特殊文件)的行为类似于管道、串行端口等。对它们进行写入或读取是一个即时操作。驱动程序如何处理数据是它自己的事情。将字节写入字符设备可能会导致它显示在屏幕上,输出到串行端口,转换为声音,......从设备读取字节可能会导致串行端口等待输入,可能返回随机byte ( /dev/urandom), ... “字符设备”这个名字来自于每个字符都被单独处理的事实。

有关更多信息,请参阅维基百科了解 /dev 及其子目录和文件


Ger*_*erg 9

它们指向一个驱动程序并且可以由[mknod][1]. 查看其手册页,似乎块设备已缓冲而字符设备未缓冲。块设备有一个“块大小”,表示可访问的块的大小。(对于存储设备,块大小通常在 512 B 和 4 KiB 之间)存储设备和内存通常作为块设备访问,而串行端口和终端等设备通常作为字符设备访问。

它们通常在 /dev 中找到(并且不能在使用nodev选项(或其等效项)安装的分区上运行)

ls -l通常找到大小的位置显示两个逗号分隔的设备编号。这些是主要和次要数字,指向驱动程序。它们的类型也在ls -l输出的权限列中指示为“c”或“b” 。

/dev 可以通过多种方式填充。在最近的 Linux 内核版本上,通常使用udev,在 Solaris 上它包含指向 /devices 的链接,这是一个虚拟的 devfs 文件系统。


Pre*_*raj 9

Unix/Linux 中的文件类型:普通或常规文件、目录、设备(特殊)文件、链接、命名管道和套接字。

\n\n

设备(特殊)文件是设备驱动程序的接口,它像普通文件一样出现在文件系统中。它们是字符设备、块设备和伪设备(如/dev/null)。

\n\n

字符驱动一次会发送一个字符,因此需要携带少量负载,但要发出很多请求。块驱动意味着您获得大量字符(数据)集合,因此您有更大的负载,但必须执行更少的请求。类比:基本上与按瓶或按板条箱购买苏打水相同。

\n\n

当您知道可以预期有多少数据时,块驱动非常有用,磁盘上的文件通常就是这种情况。

\n\n

当您不知道数据何时停止时,字符驱动更实用,因此您可以保持数据运行直到不再有字符通过。例如,互联网连接,因为您不知道将从服务器接收的数据流的大小。

\n\n

例如:

\n\n
    \n
  • 字符设备驱动程序是允许操作系统与输入/输出设备进行通信的特殊文件。例如:键盘、鼠标、显示器、音频或显卡以及盲文。
  • \n
  • 块设备用于与存储设备通信,能够缓冲输出并存储数据以供以后检索。示例:硬盘驱动器、内存。
  • \n
\n\n

礼貌

\n