a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 144|回复: 2

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

[复制链接]
发表于 2012-8-4 12:07:07 | 显示全部楼层 |阅读模式
Linux下若何获取磁盘信息熟悉Linux的都知道,Linux下硬盘的命名轨则是had、hdb…sda、sdb之类的。可是,若何才能知道机械上到底有若干好多块硬盘呢?: W2 G) r% I5 M" o2 N! c/ k4 z7 c
刚起头,我觉得/dev目录下会有所浮现结不美观我发现设备文件存在并不代表这个设备。那么怎么办才好呢。后来我发现fdisk可以获得硬盘的数目。于是就阅读了一下fdisk的源代码。不美观真找到了Linux获取硬盘数目的体例。实例代码如下:" n, v3 y; t: }  y- t3 C1 e
#include
$ b; M( n. i0 i& `8 m#include6 j$ p1 h/ D1 m" ]# F) I
int GetDiskCount()0 G) {: L  e/ f# i
{
) e; ]- |# @/ O9 [6 Z. DFILE* f = fopen(“/proc/partitions”, “r”);
- e% O# v6 ?3 s/ X  g/ C6 i0 x' g7 R0 ]if (!f)/ _' _. f) l3 t! f
{
% n) I9 W6 S' f: {* S' Q( rfprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);
$ p; A  }) z' I9 l+ A3 `return 0;( [8 t: ]7 b% x
}
2 D9 o2 q. B/ F6 J6 b6 r) Uchar line[100], ptname[100], devname[120], *s;% m$ G* x- S5 y  X9 b2 Z- _7 B5 g
int ma, mi, sz;* s0 Q/ I0 x$ _! L/ b: R
int nDiskCount = 0;6 _  A$ L& v, W6 w% ~4 h
while (fgets(line, sizeof(line), f))
' W2 v) R9 i8 c" _* s{
) c( \) ~: M9 |2 P. ]
# w* d! a' b# u8 Uif (sscanf(line, “ %u %u %u %[^\n ]”,
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:07:08 | 显示全部楼层

Linux辅导:Linux下应如何获取磁盘信息

</p>&ma, &mi, &sz, ptname) != 4)8 C+ |! A- h. a! d2 P
continue;* F1 ^; m" j  v/ A7 m/ I2 |
for (s = ptname; *s; s++)
+ Y" S- E1 u9 \4 R  }+ \6 M* }continue;; A1 \3 A, L) J7 Q& S6 k
/* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */
4 R4 u% |* R2 x% [if (s[-1] 》= ‘1’ && s[-1] 《= ‘9’); ^) p3 P3 B' T; ~* O: V" P: q
continue;
6 z" O, u  `1 r3 ]! fnDiskCount++;6 P. {( o+ j- \; u. ?
}: E3 l3 j; s* c6 S9 Y  J6 Q9 ]
fclose(f);
+ @/ u& H: w3 `3 N3 I' Oreturn nDiskCount;
5 k' \) T& g) c9 g' S: Z; H- d}; F( _& Y# t- F' W7 o' Z
int main(int argc, char * argv[])
  z; W1 q4 k- d# z) L{1 i5 B* C5 M4 V6 \) r
printf(“DiskCount: %d\n”, GetDiskCount());
( F; [0 n( a' u5 k, p* O' r. Creturn 0;
& A$ a3 R4 h5 e  U, y}
- {" f, G7 [+ Z* g其实,事理很简单。就是经由过程proc文件系统获得。在proc文件系统中有一个名为partitions的文件。这个文件中包含当地磁盘的硬盘及分区信息。按照Linux下设备命名轨则,如不美观设备名的最后一个字符是数字就应该是分区,否则就是硬盘。于是,我们就可以垂手可得的知道电脑中有几个硬盘。
# `4 i/ V! o5 b! e5 V! C当然,按照这个文件,还可以知道硬盘设备名称以及每个硬盘平分区的数目和每个分区的设备名称。至于若何获取,巨匠应该城市的。5 v' H. @% _1 a0 [$ H" G/ v
获取硬盘信息:
" \" D" R) u0 G' n2 b) |2 e此刻,我们已经可以知道硬盘数目、硬盘的设备名称、分区数及分区的设备名称。那么,怎么才能知道这些设备的信息呢?好比硬盘巨细、扇区巨细、分区巨细、分区已经使用的巨细等等。
0 M: b; i2 g+ a* M+ l0 C关于硬盘的信息,在fdisk的源码中也可以找到相关的源码。实例代码如下:
& P7 |2 I! t, Z. X9 h#include
4 ^, |, g0 W: t% p* u; s. A#include6 ^' m. I, t1 f  ^+ e
int GetDiskCount()
. i* k6 `$ u* L: S; Z' q$ D$ u& A{0 g. z1 _# o" i
FILE* f = fopen(“/proc/partitions”, “r”);  w5 s9 B4 w& b) }! A3 q
if (!f)
% A+ o) I" z' q/ T: X( H{
3 k) U; t  \) N  J/ Ffprintf(stderr, “fopen /proc/partitions failed!errno=%d\n”, errno);
+ f. }. p) j# }3 e: C& s+ e& E3 y% A/ jreturn 0;
* H+ s1 O" e: ]) s}5 @( I  }8 z7 _, f' g0 p/ [3 q
0 a! {; p: i, b5 X- Q" g3 f) ^
char line[100], ptname[100], devname[120], *s;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:07:09 | 显示全部楼层

Linux辅导:Linux下应如何获取磁盘信息

</p>int ma, mi, sz;3 C9 h* {, I2 o/ p6 O" c
int nDiskCount = 0;
9 y' O. ]! }7 _( X5 ]2 Rwhile (fgets(line, sizeof(line), f))4 B; z! Z9 r. x9 I! S
{
1 h( a; w; q  {if (sscanf(line, “ %u %u %u %[^\n ]”,+ s. ?+ J- D7 n+ Z
&ma, &mi, &sz, ptname) != 4). o  b- r. A  T# \, p7 m
continue;3 S8 ~; Y4 t+ t/ @# a5 o2 ?
for (s = ptname; *s; s++)
  B3 l( ?, J1 A/ O6 E+ A5 D( E1 zcontinue;- o# M+ i% D; T; _* W- i8 ]% R  S
/* note: excluding ‘0’: e.g. mmcblk0 is not a partition name! */
" \3 D. a- m4 G3 L3 t/ t! pif (s[-1] 》= ‘1’ && s[-1] 《= ‘9’)7 i5 H7 @5 A- \' C$ j6 Z
continue;- J' q+ n; H8 w- N7 e
nDiskCount++;
4 e3 B7 n8 G% V! s}
! |: n; R$ n5 W3 rfclose(f);! v( D6 m/ }* V- q, L- i
return nDiskCount;, u. W7 O; g8 Z. ^( G" \
}
3 q0 v; {- I' S7 hint main(int argc, char * argv[])- b$ `3 G6 l4 z2 L' E0 z- Y4 v
{
* h7 U/ m- b; Bprintf(“DiskCount: %d\n”, GetDiskCount());
$ x& F* b: {. R# q$ ~return 0;. H5 m4 y* K0 Q  w! T8 i
}. s  z% `& o. g
其实,就是经由过程打开设备文件然后分袂挪用ioctl来获取硬盘的巨细、扇区巨细、CHS信息等等。轨范运行结不美观如下:
4 y2 E4 z0 ^, B, b! i# O9 M' [user:~/$sudo 。/diskinfo /dev/sda+ i! Y2 Z8 y$ J) E1 E- J, {
Disk /dev/sda infomation:- G% c8 f5 n5 t# O" ?
Size: 42949672960 Bytes 40.00 GB
8 Z  o5 t, `* g" F. jSectorSize: 512 Bytes
- N, [1 p8 V6 Gheads: 255% k& J# X( ]# U7 N- N) G3 h
sectors: 63  `& d# W0 h7 m3 `* }* N
cylinders: 5221- M2 ?3 B% j# R; E0 ]- I
start: 0
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 22:12 , Processed in 0.162812 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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