a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 167|回复: 1

[LPI认证] linux认证辅导:Linux下如何获取磁盘信息

[复制链接]
发表于 2012-8-4 12:13:19 | 显示全部楼层 |阅读模式
熟悉Linux的都知道,Linux下硬盘的命名规则是had、hdb…sda、sdb之类的。但是,如何才能知道机器上到底有多少块硬盘呢?. c# `( J7 t% ~9 D, _* v9 d
    刚开始,我以为/dev目录下会有所体现结果我发现设备文件存在并不代表这个设备。那么怎么办才好呢。后来我发现fdisk可以得到硬盘的数量。于是就阅读了一下fdisk的源代码。果然找到了Linux获取硬盘数量的方法。实例代码如下:2 V6 I9 F- Q1 ?8 C- A5 K
    #include
; ?( I0 O5 b2 R: I" X0 K& Y" b4 [    #include
( q/ I% \+ A' I/ H, U" B) [2 r    int GetDiskCount()9 U: B  I& A4 G" m1 K( m7 X
    {
4 H! l. k8 r* h/ W1 N6 d+ N  S    FILE* f = fopen("/proc/partitions", "r");# h) H: R$ {8 n1 I1 b' O" D
    if (!f)
; e6 u$ c: _/ y) T% _' G' E    {
1 ?- p- F* x4 a& O  ^    fprintf(stderr, "fopen /proc/partitions failed!errno=%d\n", errno);$ c+ A5 ~; O; W/ P, {
    return 0;
! k$ Q" I+ a  |    }9 ?! P+ S- }3 T, v( \" |2 y  j$ p( c
    char line[100], ptname[100], devname[120], *s;
) j& ~5 y- T+ a3 }, ]1 A8 B6 `    int ma, mi, sz;
$ E9 i4 a, W( X9 K    int nDiskCount = 0;  ?+ R' p) R+ z9 `" L) _, z
    while (fgets(line, sizeof(line), f)); c; i0 u& }* {6 \3 d" _
    {6 w; \" ?5 ^: x/ g! `( z. h
    if (sscanf(line, " %u %u %u %[^\n ]",/ h) o' ~" P; |! F; _
    &ma, &mi, &sz, ptname) != 4)
( d' y( y" R. F# A    continue;
4 J7 s1 O( X( [, u4 j) Y0 R- t    for (s = ptname; *s; s++): Q* t/ n% G( E$ A
    continue;: |0 R- H3 H; k1 [, N$ ?
    /* note: excluding '0': e.g. mmcblk0 is not a partition name! */
2 L' q! Q( O, H" `! i3 O    if (s[-1] >= '1' && s[-1]
回复

使用道具 举报

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

linux认证辅导:Linux下如何获取磁盘信息

获取硬盘信息:& `: P' D& v1 A
    现在,我们已经可以知道硬盘数量、硬盘的设备名称、分区数及分区的设备名称。那么,怎么才能知道这些设备的信息呢?比如硬盘大小、扇区大小、分区大小、分区已经使用的大小等等。
; B9 y+ z- m( {, W1 b- Z    关于硬盘的信息,在fdisk的源码中也可以找到相关的源码。实例代码如下:
, A) u- r' s% x4 O# F# H    #include 8 T. I* \$ e' T4 j" G
    #include * e5 q2 o% }. t( S# B
    int GetDiskCount()
) @) ^0 S1 K. r' s    {+ A* ~6 A+ s5 b" Z6 r  J
    FILE* f = fopen("/proc/partitions", "r");
* G0 g8 y  V+ `: J: B# Z4 Y8 h2 I    if (!f)& e* E2 f+ ]% b  W* ]# O0 L
    {  ^. m/ J7 w( `( c
    fprintf(stderr, "fopen /proc/partitions failed!errno=%d\n", errno);- u4 d8 o, ~( g9 u& M
    return 0;
) i" L# d1 b. L, N    }! Q7 t; S' D( y2 |, ?
    char line[100], ptname[100], devname[120], *s;8 B' D. j/ s6 v2 I4 x2 y; K
    int ma, mi, sz;) c# |% v  c4 @
    int nDiskCount = 0;8 D+ u6 }" v/ R4 r5 k
    while (fgets(line, sizeof(line), f))
+ i9 J' m! N- p5 v4 r6 Q    {7 H8 N6 A* `. r! D& z( L4 s( _5 P
    if (sscanf(line, " %u %u %u %[^\n ]",
1 e! d1 f1 r' m9 t! Z9 y, g* O    &ma, &mi, &sz, ptname) != 4)
! w+ R8 ^' S4 p2 ^' k" p! N    continue;
  R% v/ `5 L( ]5 B    for (s = ptname; *s; s++)7 }4 D4 S+ n% L: V: k
    continue;
6 ?9 \9 N2 w6 Q: K    /* note: excluding '0': e.g. mmcblk0 is not a partition name! */
5 k+ z! c0 R; h# g) n    if (s[-1] >= '1' && s[-1]
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 00:17 , Processed in 0.354812 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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