LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 879|回复: 12

仍旧是磁盘自动检索的问题

[复制链接]
发表于 2003-7-14 21:08:25 | 显示全部楼层 |阅读模式
各位斑竹还记得我么?

小弟又来了。这次要说的有两方面。

首先上次有一位大哥贴出了一个自动检索的源代码,小弟试验过了,还是不错的,但是有一个问题,那段源代码只能对引导分区起作用,对扩展及以后的分区是无效的,小弟用很笨的方法拆析了扩展以后的分区头,没找到任何规律,是否有别的方法?

其次,我上次说用系统调用会在不明白什么原因的情况下出现问题。现在我可以告诉你们了,这个我也试过了。(我没那么表态,不是故意搞出来看的,无意中出现的。)当你把底层调用和各种高层库放在一起用时,我的应用程序在没有一点警告信息的情况下崩溃了,之后我在不断实验中发现,底层调用影响了我的主部件的现实,当我把底层调用关掉,或是把部件显示关掉时,就可以运行了。

各位大人有何看法?

/*另外:上次台风狼大人给我一点关于拷贝时如何添加空格的提示,我在不断试验后发现,在程序设计时需要加两个转义符,还不能有他说得单引号。请各位像我一样的菜鸟在使用时注意。*/
发表于 2003-7-14 21:11:34 | 显示全部楼层
那先看看分区表的资料

定义的有

主分区表是保存每个分区信息
扩展分区表是连表形式
 楼主| 发表于 2003-7-14 21:25:58 | 显示全部楼层

无双斑竹请明示

你所说的扩展分区的链表我该到哪里去找呢?
我把我的硬盘上的分区的hda文件的头都看过了,似乎那个也不是。
发表于 2003-7-15 01:15:57 | 显示全部楼层
这种文章网上很多看看http://www.pcworld.com.cn/2000/back_issues/2016/1633.asp 主要是下面的图。

就是在分区表里取得扩展分区的起始位置,读入扩展分区的第一个扇区,里面有逻辑盘的信息和下一个逻辑盘的信息,再读入下一个逻辑盘的第一个扇区,直到逻辑盘的第一个扇区里没有下一个逻辑盘的信息,这就是最后一个逻辑盘。
发表于 2003-7-15 05:37:32 | 显示全部楼层
本来认为可以直接open("/dev/hda5"...打开第一个逻辑盘,读第一个扇区,但是试了一下不成功,不知道为什么,我前面用dd if=/dev/hda5 of=hda5fs count=1试了一下可以的,但是后来再试又不行了,难道我记错了?奇怪。

  1. #include <stdio.h>
  2. #define __USE_FILE_OFFSET64
  3. #include <unistd.h>
  4. #include <fcntl.h>

  5. struct {
  6.   unsigned int index;
  7.   char *name;
  8. } typeinfo[] = {
  9.   0x0,  "none",
  10.   0x1,  "FAT12",
  11.   0x2,  "XENIX root",
  12.   0x3,  "XENIX usr",
  13.   0x4,  "FAT16 <=32M",
  14.   0x5,  "EXTEND",
  15.   0x6,  "FAT16 >=32M",
  16.   0x7,  "OS/2 HPFS",
  17.   0x8,  "AIX",
  18.   0x9,  "AIX bootable",
  19.   0xa,  "OS/2 boot manager",
  20.   0xb,  "FAT32",
  21.   0xc,  "FAT32 (LBA)",
  22.   0xe,  "FAT16 (LBA)",
  23.   0xf,  "EXTEND (LBA)",
  24.   0x40, "Venix 80286",
  25.   0x51, "Novell",
  26.   0x52, "Microport",
  27.   0x63, "GNU HURD",
  28.   0x64, "Novell Netware 286",
  29.   0x65, "Novell Netware 386",
  30.   0x75, "PIC/IX",
  31.   0x80, "Old MINIX",
  32.   0x81, "Linux/MINUX",
  33.   0x82, "Linux SWAP",
  34.   0x83, "Linux Native",
  35.   0x85, "Linux EXTEND",
  36.   0x93, "Amoeba",
  37.   0x94, "Amoeba BBT",
  38.   0xa5, "BSD/386",
  39.   0xa6, "OpenBSD",
  40.   0xa7, "NEXTSTEP",
  41.   0xb7, "BSDI fs",
  42.   0xb8, "BSDI swap",
  43.   0xc7, "Syrinx",
  44.   0xdb, "CP/M",
  45.   0xe1, "DOS access",
  46.   0xe3, "DOS R/O",
  47.   0xf2, "DOS secondary",
  48.   0xff, "BBT"
  49. };

  50. void getPartitions(char *);
  51. void getLogic(char *, long long int);
  52. void printPType(unsigned int);
  53. int readSector(unsigned char *, char *, long long int);

  54. int
  55. main(int argc, char *argv[])
  56. {
  57.   int i;
  58.   char hd[10];

  59.   if(argc == 1){
  60.     fprintf(stderr, "usage: %s hdx\n", argv[0]);
  61.     exit(-1);
  62.   }

  63.   for(i = 1; i < argc; ++i){
  64.     if(strlen(argv[i]) != 3
  65.         || argv[i][0] != 'h' || argv[i][1] != 'd'
  66.         || argv[i][2] < 'a' || argv[i][2] > 'd'){
  67.       fprintf(stderr, "%s is error name\n", argv[i]);
  68.       continue;
  69.     }
  70.     strcpy(hd, "/dev/");
  71.     strcat(hd, argv[i]);
  72.    
  73.     getPartitions(hd);
  74.     printf("\n");
  75.   }
  76.   
  77.   exit(0);
  78. }

  79. /* 读分区表并打印4个主分区 */
  80. void
  81. getPartitions(char *hd)
  82. {
  83.   int i;
  84.   unsigned char *type, buf[512];
  85.   long long int off;

  86.   printf("%s:\n----------\n", hd);
  87.   if(readSector(buf, hd, 0) < 0)
  88.     return;
  89.   for(i = 0, type = buf + 446 + 4; i < 4; ++i, type += 16){
  90.     printf("%s%d: ", hd, i + 1);
  91.     printPType(*type);
  92.     printf("\n");
  93.     if(*type == 0x5 || *type == 0xf){
  94.       off = *((unsigned int *)(type + 4));
  95.       getLogic(hd, off);
  96.     }
  97.   }
  98. }

  99. /* 读逻辑盘的第一个扇区,并打印类型 */
  100. void
  101. getLogic(char *hd, long long int off)
  102. {
  103.   int i;
  104.   char hdx[15];
  105.   unsigned char type, buf[512];
  106.   long long int coff = 0;

  107.   for(i = 5; ; ++i){
  108.     sprintf(hdx, "%s%d", hd, i);
  109.     if(readSector(buf, hd, off + coff) < 0)
  110.       return;
  111.     type = buf[446 + 4];
  112.     printf("  %s: ", hdx);
  113.     printPType(type);
  114.     printf("\n");
  115.     if(buf[446 + 4 + 16] == 0)
  116.       return;
  117.     else
  118.       coff = *((unsigned int *)(buf + 446 + 16 + 8));
  119.   }
  120. }

  121. /* 打印分区类型 */
  122. void
  123. printPType(unsigned int type)
  124. {
  125.   int i;

  126.   for(i = 0; i < sizeof(typeinfo) / sizeof(typeinfo[0]); ++i){
  127.     if(typeinfo[i].index == type){
  128.       printf("%s", typeinfo[i].name);
  129.       return;
  130.     }
  131.   }
  132.   printf("unknown");
  133. }

  134. /* 读hd盘的第off扇区 */
  135. int
  136. readSector(unsigned char *buf, char *hd, long long int off)
  137. {
  138.   int fd;
  139.   char errstr[1024];

  140.   if((fd = open(hd, O_RDONLY)) < 0){
  141.     snprintf(errstr, 1023, "%s cannot open", hd);
  142.     perror(errstr);
  143.     return(-1);
  144.   }
  145.   off *= 512;
  146.   if(lseek(fd, off, SEEK_SET) < 0){
  147.     snprintf(errstr, 1023, "cannot seek %s to %lld", hd, off);
  148.     perror(errstr);
  149.     close(fd);
  150.     return(-1);
  151.   }
  152.   if(read(fd, buf, 512) != 512){
  153.     snprintf(errstr, 1023, "cannot read first sector for %s", hd);
  154.     perror(errstr);
  155.     close(fd);
  156.     return(-1);
  157.   }
  158.   close(fd);
  159.   return(0);
  160. }
复制代码
 楼主| 发表于 2003-7-15 21:00:59 | 显示全部楼层

各位老大,小弟谨遵法旨。

听君一席话,胜卖十年书。我忽然有一种茅厕顿开之感。

好的,我这就去试验,但是还要劳烦各位斑竹,下次有了困难小弟还回来,小弟再次拜谢。
 楼主| 发表于 2003-7-15 21:09:58 | 显示全部楼层

对了,还有个小问题

各位大人谁知道vmlinuxz是干什么用的?是什么的缩写呢?
还有qt又是什么的缩写呢?
是不是和他的公司有关?
发表于 2003-7-15 21:21:38 | 显示全部楼层
vmlinuxz是压缩过的linux内核。qt是图形库,用来开发图形用户界面程序。如果要进一步了解,可以到置顶的论坛索引中查找相关链接。
发表于 2003-7-16 17:37:03 | 显示全部楼层
 楼主| 发表于 2003-7-16 20:18:58 | 显示全部楼层

谢谢,再次表示感谢

但是我仍旧没能了解他的全称该是什么,
咳,反正linux下的缩写也特别乱。

对了,各位大人,小弟尚有一事不明,再多线程编程下,关于信号量的应用,(有的书叫同步量),其中有一种说法就是关于wait的,他又一个类似的函数,叫trywait,小弟不明白,按道理,同步量是用来避免冲突的,所以,大多是情况下使用wait,叫做拥塞式。但是为什么还会有这种叫非拥塞式的函数呢?(有些书上叫阻塞)。同步本该是拥塞的呀?

书上说:“trywait是wait的一个非拥塞排档,再此就不对他的使用作具体介绍了。……”

请各位大人费心。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表