LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: potty

如何在程序设计是调用外部命令

[复制链接]
发表于 2003-7-12 10:06:41 | 显示全部楼层
最初由 potty 发表
至于文件的复制,我当然是用系统调用做的,但是我的师傅说系统调用是有时候会有问题。资深系统分析员的话我还是比较相信的。

:ask
所有用户程序和所有文件系统的访问,都通过内核处理、监视和控制。而对于系统调用来说,它实际是内核的一部分。

如果系统调用会有问题,那么这个系统也应该是不稳定的。

就象常用的库函数system()、fopen()、fclose()....最终都是通过系统调用来实现的。
 楼主| 发表于 2003-7-12 19:56:46 | 显示全部楼层

继续

谢谢指教。关于系统调用的东西我会再测的。

现在仍旧没有解决的问题就是硬盘的检测了。一方面是abcd四个口的设备检测,另一方面是对已知是硬盘的口进行分区的监测。这样才可以将相应的目录信息显示出来。

有没有一些更接近程序实现的建议?谢谢。
发表于 2003-7-12 20:30:36 | 显示全部楼层
读/proc不行吗?
简单又好用。
 楼主| 发表于 2003-7-12 21:10:34 | 显示全部楼层

这位老大回复的好快呀

是呀,读/proc倒是可以解决硬盘的问题,我不用再去检测硬盘了。但是如何用它来检测分区呢?我只要vfat32,但是从那里读到的似乎没有相关信息。

还请老大继续指点一下。
发表于 2003-7-13 01:38:47 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <fcntl.h>

  3. void printPType(unsigned char *, char *);

  4. int
  5. main(int argc, char *argv[])
  6. {
  7.   int fd, n, d;
  8.   char hd[10], errstr[1024];
  9.   unsigned char buf[512];

  10.   if(argc == 1){
  11.     fprintf(stderr, "usage: %s hdx\n", argv[0]);
  12.     exit(-1);
  13.   }

  14.   for(d = 1; d < argc; ++d){
  15.     if(strlen(argv[d]) > 3
  16.         || argv[d][0] != 'h' || argv[d][1] != 'd'
  17.         || argv[d][2] < 'a' || argv[d][2] > 'd'){
  18.       fprintf(stderr, "%s is error name\n", argv[d]);
  19.       continue;
  20.     }
  21.     strcpy(hd, "/dev/");
  22.     strcat(hd, argv[d]);
  23.    
  24.     if((fd = open(hd, O_RDONLY)) < 0){
  25.       snprintf(errstr, 1023, "cannot open %s", hd);
  26.       perror(errstr);
  27.       continue;
  28.     }
  29.     if((n = read(fd, buf, 512)) != 512){
  30.       snprintf(errstr, 1023, "cannot read first sector for %s", hd);
  31.       perror(errstr);
  32.       close(fd);
  33.       continue;
  34.     }
  35.     close(fd);

  36.     printf("%s:\n----------\n", hd);
  37.     printPType(buf + 446, hd);
  38.   }
  39.   
  40.   exit(0);
  41. }

  42. void
  43. printPType(unsigned char *dpt, char *hd)
  44. {
  45.   int i = 0;
  46.   unsigned char type;

  47.   for(i = 0; i < 4; ++i, dpt += 16){
  48.     type = *(dpt + 4);
  49.     printf("%s%d: ", hd, i + 1);
  50.     switch(type){
  51.     case 0:
  52.       printf("none\n");
  53.       break;
  54.     case 1:
  55.       printf("FAT12\n");
  56.       break;
  57.     case 4:
  58.       printf("FAT16 (<32M)\n");
  59.       break;
  60.     case 5:
  61.       printf("EXTEND (<2G)\n");
  62.       break;
  63.     case 6:
  64.     case 0xe:
  65.       printf("FAT16 (>32M)\n");
  66.       break;
  67.     case 7:
  68.       printf("NTFS\n");
  69.       break;
  70.     case 0xb:
  71.       printf("FAT32\n");
  72.       break;
  73.     case 0xc:
  74.     case 0xf:
  75.       printf("EXTEND (>2G)\n");
  76.       break;
  77.     case 0x82:
  78.       printf("Linux SWAP\n");
  79.       break;
  80.     case 0x83:
  81.       printf("Linux Navite\n");
  82.       break;
  83.     default:
  84.       printf("unknown type\n");
  85.       break;
  86.     }
  87.   }
  88. }
复制代码

用xxx hda hdb之类的命令,必须是root用户,
程序只能显示主分区,不能显示逻辑盘,不过原理一样。
我今天在网上大概查了一下分区类型,好多都没有查到(也没好好查),比如FreeBSD的类型就没有加进去。
当然,程序也有一些问题,不过基本功能还行。
发表于 2003-7-13 02:21:44 | 显示全部楼层
找到一张表:

  1. 00        空白
  2. 01        DOS 12-bit FAT
  3. 02        XENIX root
  4. 03        XENIX usr
  5. 04        DOS 16-bit <=32M
  6. 05        扩展
  7. 06        DOS 16-bit >=32
  8. 07        OS/2 HPFS
  9. 08        AIX
  10. 09        AIX 可引导
  11. 0a        OS/2 引导管理器
  12. 0b        Win95 FAT32
  13. 0c        Win95 FAT32 (LBA)
  14. 0e        Win95 FAT16 (LBA)
  15. 0f        Win95 扩展 (LBA)
  16. 40        Venix 80286
  17. 51        Novell
  18. 52        Microport
  19. 63        GNU HURD
  20. 64        Novell Netware 286
  21. 65        Novell Netware 386
  22. 75        PIC/IX
  23. 80        Old MINIX
  24. 81        Linux/MINUX
  25. 82        Linux 交换区
  26. 83        Linux Native
  27. 85        Linux 扩展
  28. 93        Amoeba
  29. 94        Amoeba BBT
  30. a5        BSD/386
  31. a6        OpenBSD
  32. a7        NEXTSTEP
  33. b7        BSDI fs
  34. b8        BSDI swap
  35. c7        Syrinx
  36. db        CP/M
  37. e1        DOS access
  38. e3        DOS R/O
  39. f2        DOS secondary
  40. ff        BBT
复制代码
 楼主| 发表于 2003-7-13 10:37:49 | 显示全部楼层

谢谢你libinary

感谢你贴出的源代码,我回去试试看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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