首页
登录 | 注册

第四章*文件与目录(二十三)--设备特殊文件(Device Special Files)

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。


相关文章

  • 注意,我并不会是百分之一百正确的.例如,一个系统很可能没有/proc文件系统支持,但是大多数系统肯定有.这里我假定你是"随大流的",并有一个典型配置的系统. 什么是符号(Symbols)? 内核符号表(Kernel Sy ...
  • 漫谈linux文件IO
        在Linux 开发中,有几个关系到性能的东西,技术人员非常关注:进程,CPU,MEM,网络IO,磁盘IO.本篇文件打算详细全面,深入浅出.剖析文件IO的细节.从多个角度探索如何提高IO性能.本文尽量用通俗易懂的视角去阐述.不copy ...
  • 测试工作中,批量的数据通常会放到excel表格中,测试输出的数据写回表格中,这样输入输出易于管理,同时清晰明了 使用ruby来操作excel文件首先需要在脚本里包含以下语句require 'win32ole' 把win32ole包含进来后, ...
  • 一些系统可能需求把数据导出到Access或者Excel文件格式,以方便的传递数据.打印等.Excel 文件或者 Access这两种需要导出的文件可能并不是事先就存在的,这就需要我们自己编程生成他们,下面整理一下生成这两个文件的一些方法,只罗 ...
  • 今天想试试Linux系统下把java应用程序打包成.jar文件,在网上找了很多相关的博客,发现他们理论讲得很到位,但是按照他们的方式操作发现很多错误,最后综合几篇文章终于尝试成功.多学习别人的失败,更容易带你走向成功,现在把自己操作过程罗列 ...
  • 《循序渐进Linux》第二版即将出版发行(附封面)
    从<循序渐进Linux>第一版发布,到现在已经近6年了,6年的时间,技术发生了很大的变化,Linux系统的内核版本从2.6.9(RHEL4.x)已经更新到了现在的3.10(Centos7.x),第一版中的部分内容已经陈旧,Lin ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.014 s.
京ICP备10005923号