Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1798441
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

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的系统的里找到。Solaris把它们定义在。Linux把这些宏定义在,它被所引 用。


3、系统上的每个文件名的st_dev的值是包含这个文件和它对应的i-node的文件系统的设备号。


4、只有字符特殊文件和块特殊文件才有一个st_rdev值。这个值包含了真实设备的设备号。


看下面的代码:



  1. #include <sys/types.h>
  2. #include <sys/stat.h>

  3. int
  4. main(int argc, char *argv[])
  5. {
  6.     int i;
  7.     struct stat buf;

  8.     for (i = 1; i < argc; i++) {
  9.         printf("%s: ", argv[i]);
  10.         if (stat(argv[i], &buf) < 0) {
  11.             printf("stat error");
  12.             continue;
  13.         }

  14.         printf("dev = %d/%d", major(buf.st_dev), minor(buf.st_dev));
  15.         if (S_ISCHR(buf.st_mode) || S_ISBLK(buf.st_mode)) {
  16.             printf(" (%s) rdev = %d%d",
  17.                 (S_ISCHR(buf.st_mode)) ? "character" : "block",
  18.                 major(buf.st_rdev), minor(buf.st_rdev));
  19.         }
  20.         printf("\n");
  21.     }
  22.     exit(0);
  23. }


  $ ./a.out / /home/tommy /dev/tty[01]
/: dev = 8/1
/home/tommy: dev = 8/1
/dev/tty0: dev = 0/5 (character) rdev = 40
/dev/tty1: dev = 0/5 (character) rdev = 41

查看当前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。

阅读(1060) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~