分类: 系统运维
2012-03-28 14:07:38
st_dev和st_rdev这两个域经常令人困惑。我们将在18.9节写ttyname函数时需要这些域。规则很简单:
1、每个文件系统都有它的主要的和次要的设备号,它们有原始系统数据类型dev_t编码。主设备号标识了设备驱动,有时也编码为与其交流的外设主板,从设
备号标识了指定的从设备。回想下4.14节关于文件系统的几个图,硬盘经常包含几个文件系统。在同一个硬盘上的每个文件系统通常有相同的主设备号,但是有
不同的从设备号。
2、我们通常可以使用多数实现定义的两个宏:major和minor,来访问主从设备号。这意味着我们不必知道在dev_t对象的两个号是如何存储的。早
期系统把设备号存储为16位整型,8位为主设备号,24位为从设备号。FreeBSD 5.2.1和Mac OS X
10.3用一个32位整型表示dev_t,14位为主设备号而18位为从设备号。在64位系统上,Solaris
9用64位整型表示dev_t,两者各32位。在Linux 2.4.22,尽管dev_t是一个64位整型,目前主从设备号都只有8位。
POSIX.1指出dev_t类型的存在,但并没有定义它包含的内容,以及如何获取它的内容。宏major和minor被多数实现所定义。它们定义的头文
件也取决于实现。它们可以在基于BSD的系统的
3、系统上的每个文件名的st_dev的值是包含这个文件和它对应的i-node的文件系统的设备号。
4、只有字符特殊文件和块特殊文件才有一个st_rdev值。这个值包含了真实设备的设备号。
看下面的代码:
查看当前mount的设备,以及对应的目录
$ mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro,user_xattr,commit=0)
通过ls来查看它们的设备号
$ ls -lL /dev/tty[01] /dev/sda[01]
brw-rw---- 1 root disk 8, 1 2012-02-23 14:36 /dev/sda1
crw--w---- 1 root tty 4, 0 2012-02-23 14:36 /dev/tty0
crw------- 1 root root 4, 1 2012-02-23 14:36 /dev/tty1
硬盘设备是块特殊文件,而两个终端设备是字符特殊文件。(通常,块特殊文件的设备唯一的类型是那么可以包含随机访问(random-access)文件系统:硬盘、软盘、CD-ROM等等。UNIX系统的一些早期版本支持磁带的文件系统,但这已经不再广泛使用了。)
注意两个终端设备(st_dev)的文件名和i-node是在设备0/5--实现/dev的devfs伪文件系统--然而它们真实的设备号是4/0和4/1。