a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 78|回复: 0

[综合辅导] Linux认证之Linux下应如何获取磁盘信息

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux认证之Linux下应如何获取磁盘信息; H5 Z/ h5 i* p
Linux下如何获取磁盘信息熟悉Linux的都知道,Linux下硬盘的命名规则是had、hdb…sda、sdb之类的。但是,如何才能知道机器上到底有多少块硬盘呢?
6 V+ N; w  N+ @8 M% P4 N4 t刚开始,我以为/dev目录下会有所体现结果我发现设备文件存在并不代表这个设备。那么怎么办才好呢。后来我发现fdisk可以得到硬盘的数量。于是就阅读了一下fdisk的源代码。果然找到了Linux获取硬盘数量的方法。实例代码如下:% u9 @* ^2 Q7 m  j! N
#include. B% e5 P! c5 E% h; A
#include# G4 E- I) @. C8 A9 g- Q
int GetDiskCount()
, P+ W9 D- b1 C9 i" _/ u{
8 L; m7 |) A5 T* g. s( O/ uFILE* f = fopen(“/proc/partitions”, “r”);
) k- e5 \! P! ?( h1 Gif (!f)
& l8 x/ `3 u  }! N! H, F1 T, r/ Q{5 T+ [/ U2 W/ _& q
fprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);
* Y1 C  |) n& {) m' R- l( freturn 0;% E" }; y7 Q6 k7 f9 _" U
}
0 f% B' j$ D3 _8 @* ?% `' o2 uchar line[100], ptname[100], devname[120], *s;) @5 w; Z* t% j1 Y) {& m
int ma, mi, sz;
% f& A3 j7 \$ }2 d$ A% eint nDiskCount = 0;) T& R  _: n! X8 O
while (fgets(line, sizeof(line), f)). E5 R1 K9 `# F/ a' k( d7 {
{$ x! _' S/ p! m; F; Q4 S5 ~- t
if (sscanf(line, “ %u %u %u %[^\n ]”,
' \3 N& ]( T8 h+ O$ o& B2 W) ?&ma, &mi, &sz, ptname) != 4)
. T+ E  M' }7 P! m- y" dcontinue;
9 J8 r: N3 Y4 z' [  sfor (s = ptname; *s; s++)
$ W( k. `4 z3 N) x! N* Bcontinue;
/ `2 W4 ?1 R+ W5 P" Q/* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */, h* D2 V1 I8 H" ], a7 {
if (s[-1] 》= ‘1’ && s[-1] 《= ‘9’)' o4 K# [, |4 r: h+ q
continue;
. i& s" c& a. G& M# _  ]( @) W# tnDiskCount++;
3 k9 V% y7 J9 j% u, D}
0 x2 N# w( H1 z" h# H6 Dfclose(f);
5 D7 b, J6 Z- {2 kreturn nDiskCount;$ k5 S+ n* f1 r0 g3 M5 H
}& y/ X, l: W2 ~6 q" i- ~' ^
int main(int argc, char * argv[])
6 z. A& z& n1 B9 `" A! ^{2 d- G0 k6 g5 S: S) x4 |' V  B
printf(“DiskCount: %d\n”, GetDiskCount());/ S- [' {; r* s- L) H" N
return 0;9 t* ^; q" T5 j
}8 k; V% v9 u5 E" i3 }9 x4 Z- q
其实,原理很简单。就是通过proc文件系统获得。在proc文件系统中有一个名为partitions的文件。这个文件中包含本地磁盘的硬盘及分区信息。根据Linux下设备命名规则,如果设备名的最后一个字符是数字就应该是分区,否则就是硬盘。于是,我们就可以轻而易举的知道电脑中有几个硬盘。
( K* v$ D& Y: N+ G( ?# {当然,根据这个文件,还可以知道硬盘设备名称以及每个硬盘中分区的数量和每个分区的设备名称。至于如何获取,大家应该都会的。" k  X* A' W/ Q( `" G# ?
获取硬盘信息:
- s. K* C+ x, o% T, i现在,我们已经可以知道硬盘数量、硬盘的设备名称、分区数及分区的设备名称。那么,怎么才能知道这些设备的信息呢?比如硬盘大小、扇区大小、分区大小、分区已经使用的大小等等。( R& q4 C  p: L* |
关于硬盘的信息,在fdisk的源码中也可以找到相关的源码。实例代码如下:* u; u. l; k8 h4 m
#include. o& H# U: L1 c& u8 G3 }+ P
#include
# z5 {4 q& X  Y' p2 Yint GetDiskCount(). x! b* F5 k- n6 G/ h. ~* q
{
" _% O/ g4 @6 a0 E: c3 K; IFILE* f = fopen(“/proc/partitions”, “r”);
6 L9 E+ B" \' q& F$ r) l9 Oif (!f)9 _, g$ M) M- D- r$ W
{  v: I% d/ K7 d5 B' V
fprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);: \" x& t7 q9 X+ m7 h. P0 q$ s
return 0;8 s, ^+ w% z0 C6 V- o1 L
}+ u: N6 x- n1 ~  U. V1 E# c( s
char line[100], ptname[100], devname[120], *s;- F$ Q- E7 s% Q. j; C
int ma, mi, sz;& L2 J2 D3 ^: u% w4 E- L
int nDiskCount = 0;; m7 o# \3 l. x+ H$ r4 ]
while (fgets(line, sizeof(line), f))
" Z' X' Q3 u8 G% T{! m5 @+ [+ k  A9 T4 P) m5 \1 E. T
if (sscanf(line, “ %u %u %u %[^\n ]”,( {3 [" \" Y8 `. b5 a7 j
&ma, &mi, &sz, ptname) != 4)
7 c8 I5 x4 `" T( @continue;' e' o1 a" b( q7 p+ M
for (s = ptname; *s; s++)0 s7 a( h" v( Y% c( r% K
continue;
$ E+ o' \2 Q8 x+ F3 C4 f/* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */, ^$ b5 f& p: t2 Z% x- y( }0 E
if (s[-1] 》= ‘1’ && s[-1] 《= ‘9’)) c! y8 W7 r1 K8 f
continue;
9 O3 X* R4 U2 e% l) C& M8 r: t5 ]nDiskCount++;0 @% L8 X/ f  h" {" v% \
}
' L% K; P: l' a2 h# Z. ^fclose(f);0 j& F. F- _0 H$ F4 k
return nDiskCount;8 ?1 C+ }. C) k: a4 j  t& l
}4 M. D: E- M  V  x/ P
int main(int argc, char * argv[])5 f" g; n: i  d! A
{: |  M9 d# ~$ w) i* M" `  Z
printf(“DiskCount: %d\n”, GetDiskCount());6 K- P  \$ h' M6 B" K$ `
return 0;. H$ [0 K$ [+ b3 O( l8 b
}
1 h8 Y3 |! U' t8 T其实,就是通过打开设备文件然后分别调用ioctl来获取硬盘的大小、扇区大小、CHS信息等等。程序运行结果如下:
$ A: z9 {5 n  e( ?% t% Iuser:~/$sudo 。/diskinfo /dev/sda4 m) H& T+ r. G, B4 C
Disk /dev/sda infomation:
/ E2 q7 O4 _- o* c& Y2 jSize: 42949672960 Bytes 40.00 GB# z/ W7 |; f4 O4 S
SectorSize: 512 Bytes
* n& e1 L' P3 z- `; h9 xheads: 255
# w% U$ `- L/ l% B) |  r  Isectors: 63+ A8 {/ ^2 r7 R  \3 d. v5 ?+ G
cylinders: 5221
; k  e+ a3 u& t. v( \' [/ Ystart: 0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-21 11:51 , Processed in 0.192088 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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