漫谈 Unix 中的设备文件
漫谈 Unix 中的设备文件
[ 设备文件 ]
UNIX具有一种统一的、优美的访问硬件的方法。 在UNIX中,每一个硬件设备都被看作是一个文
件。为了说明这个问题,我们来做如下的演示,查看 /dev/hda 这个设备文件:
less -f /dev/hda
其实,/dev/hda 并不是一个文件,当我们读取这个设备文件的时候,实际情况是我们直接访问
了电脑的第一个物理硬盘。如同大家熟知的那样,/dev/hda 是一个设备文件,所有的设备文件
都是位于/dev目录下的。
设备文件可以用来访问硬件,如果你安装了一个声卡并且做好了设定,你可以做下面的尝试:
cat /dev/dsp > my_recording
然后对着麦克风说些什么,接着敲入下面的命令:
cat my_recording > /dev/dsp
这会将你刚才说的内容透过扬声器播放出来。(注意:这样的操作不是都会正常工作的,有可能
是录音的音量没有设定正确,也有可能记录的帧数不正确。)
如果你的鼠标目前未被任何程序占用,你也可以作如下的尝试:
cat /dev/mouse
这时,如果你移动鼠标,鼠标控制协议的命令内容会直接显示在你的屏幕上 (看上去像是一些垃
圾数据),这是一种非常简洁的方式,可以来判断你的鼠标是否工作正常。
在一些比较低的层面,程序常以2种基本的方式来访问设备文件:
1) 读写设备文件来发送或是接收大批的数据 (比如类似前文提到的less和cat)
2) 使用C ioctl (IO Control) 函数来设定设备 (以声卡来说,可能是设置单声道或是立体声,
记录的速度等等)
因为每种我们能够列举出来的设备,都可以被转换来适应上面的2种操作模式(网卡除外). 这种模
式从一开始就延续到现在,可以说是访问硬件设备的通用方法了。
[块设备和字符设备]
硬件设备通常会有2种分类,类似象硬盘和磁带这样的我们叫做随机访问设备,类似像鼠标、声卡、
终端机这样的我们称之为串行设备。
另一种说法:字符设备是不通过缓存进行访问的系统组件或是外围设备(比如以太网卡或是打印机)
随机访问设备常用来读取保存在持久介质上的大量的相互毗邻的数据块. 这些数据是从分散的单元
中读取出来的(大多数情况下是磁盘,每次读取1024个字节),这些就是我们所说的块设备。
执行ls -l /dev/hda命令将会显示出你的硬盘是一个设备文件,它们在长格式下列出的时候在
最左边是以b开头的:
brw-r----- 1 root disk 3, 64 Apr 27 2005 /dev/hdb
另一方面,串行设备则是每次读取一个字节,且数据是被独占的。例如,当一个字节的数据从鼠标
设备被某个程序读取时,其他程序是无法读取的。在ls -l表示的详细列表中,字符设备是以c开
头的。你的 /dev/dsp (数字信号处理器,-- 比如声卡)设备看起来类似:
crw-r--r-- 1 root sys 14, 3 Jul 18 2005 /dev/dsp
[主次设备号]
设备被划分出来的类别叫做主设备号,举例来说,所有的SCSI磁盘的主设备号为8。更进一步来说,
每一个单独的设备拥有一个次设备号,好比 /dev/sda,它的从设备号就是0。主次设备号用来作
为面向内核的设备标识符。
一句话:major number用来识别设备类别,而minor number用来区别每一个设备类型中的某个
具体的设备。
设备的文件名实际上只是按照约定和命名规范给出的一些缩写,我们可以通过下面的方式来查看主
次设备号:
ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 May 5 2005 /dev/sda
这里的(8, 0)就是主次设备编号。
未完,待续...