免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1702 | 回复: 5
打印 上一主题 下一主题

关于APUE中的一个问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-16 21:43 |只看该作者 |倒序浏览
在第四章中的程序4-10中;
     1  /* test4_10.c -- show the usage of st_dev and st_rdev */
     2  #include        <sys/stat.h>
     3  #include        "../ourhdr.h"
     4
     5  int
     6  main(int argc, char *argv[])
     7  {
     8      int         i;
     9      struct stat buf;
    10
    11      for(i = 1; i < argc; i++) {
    12          printf("%s: ", argv[i]);
    13          if(lstat(argv[i], &buf) < 0) {
    14             printf("lstat error\n");
    15             exit(-1);
    16          }
    17
    18          printf("dev = %d/%d", major(buf.st_dev), minor(buf.st_dev));
    19
    20          if(S_ISCHR(buf.st_mode) || S_ISBLK(buf.st_mode)) {
    21             printf(" (%s) rdev = %d/%d",
    22                          (S_ISCHR(buf.st_mode)) ? "character" : "block",
    23                          major(buf.st_dev), minor(buf.st_mode));
    24          }
    25     printf("\n");
    26     }
    27     exit(0);
    28  
可以正常输出结果,
[123@localhost charpter4]$ ./a.out / ./ /dev/tty[12]
/: dev = 3/3
./: dev = 3/3
/dev/tty1: dev = 0/13 (character) rdev = 0/144
/dev/tty2: dev = 0/13 (character) rdev = 0/144
[123@localhost charpter4]$
但有几点不明白: 1. 主设备号和次设备号到底是啥意思? (我在网上查了一下. 主设备号: 用来区分不同类型的设备,从我上边的输出可以看出这点; 次设备: 表示不同的设备, 这个就有点不懂了从我的程序输出也看不出来有啥区别), 还有这些设备号在哪儿定义,根据什么来定义? 2. 在13行中为啥要用lstat而不用stat(如果lstat的参数是符号连接的话, 那么lstat将测试符号连接的属性, 而符号连接的属性应该和它所指向的文件属性是一样的(这点是个人理解),那么用stat(可以跟随符号连接)不是可以实现同样的功能吗?).
小弟是刚开始看, 理解有限, 有不对的地方, 请大家多多指教.

论坛徽章:
0
2 [报告]
发表于 2006-10-16 21:51 |只看该作者
内核处理特殊文件,通过主设备号选择驱动(比如你要读磁盘快/dev/hda1的前512个字节),在把hda1(比如是你的windows c:)对应的次设备传递给磁盘的驱动,磁盘才知道是hda1(windows c 而不是hda2(windows d
你目前可以这么理解主次设备号。
后面那个问题自己再看看。

论坛徽章:
0
3 [报告]
发表于 2006-10-16 22:50 |只看该作者

回复 1楼 aitongqi017 的帖子

每个设备有设备号(linux2.4中是一个unsigned short型),设备号由主设备号(高字节)和次设备号(低字节)组成。
假设机器存在两个usb口,此时,它们的驱动是一样的(主设备号一样),为了使用具体的哪一个,那需要次设备号来说明。

论坛徽章:
0
4 [报告]
发表于 2006-10-16 22:57 |只看该作者
原帖由 flw2 于 2006-10-16 21:51 发表
内核处理特殊文件,通过主设备号选择驱动(比如你要读磁盘快/dev/hda1的前512个字节),在把hda1(比如是你的windows c:)对应的次设备传递给磁盘的驱动,磁盘才知道是hda1(windows c 而不是hda2(windows d。 ...



谢谢flw2!
那么按你的理解是不是, 次设备号指向了i节点. 从而从i节点中提取信息给主设备号所指向的驱动程序?

论坛徽章:
0
5 [报告]
发表于 2006-10-16 23:01 |只看该作者
原帖由 lisan 于 2006-10-16 22:50 发表
每个设备有设备号(linux2.4中是一个unsigned short型),设备号由主设备号(高字节)和次设备号(低字节)组成。
假设机器存在两个usb口,此时,它们的驱动是一样的(主设备号一样),为了使用具体的哪一个,那 ...



谢谢!
这个我能理解一点, 但是我想知道具体的实现过程和机制?

论坛徽章:
0
6 [报告]
发表于 2006-10-17 05:48 |只看该作者
关于某些函数的作用,可以用 whatis 或者 man 命令查看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP