熟悉Linux的都知道,Linux下硬盘的命名规则是had、hdb…sda、sdb之类的。但是,如何才能知道机器上到底有多少块硬盘呢?
刚开始,我以为/dev目录下会有所体现结果我发现设备文件存在并不代表这个设备。那么怎么办才好呢。后来我发现fdisk可以得到硬盘的数量。于是就阅读了一下fdisk的源代码。果然找到了Linux获取硬盘数量的方法。实例代码如下:

    #include <stdio.h>
    #include <errno.h>
    int GetDiskCount()
    {
    FILE* f = fopen("/proc/partitions", "r");
    if (!f)
    {
    fprintf(stderr, "fopen /proc/partitions failed!errno=%d\n", errno);
    return 0;
    }
    char line[100], ptname[100], devname[120], *s;
    int ma, mi, sz;
    int nDiskCount = 0;
    while (fgets(line, sizeof(line), f))
    {
    if (sscanf(line, " %u %u %u %[^\n ]",
    &ma, &mi, &sz, ptname) != 4continue;
    fors = ptname; *s; s++)
    continue;
    /* note: excluding '0': e.g. mmcblk0 is not a partition name! */
    ifs[-1] >= '1' && s[-1] <= '9'continue;
    nDiskCount++;
    }
    fclose(f);
    return nDiskCount;
    }
    int main(int argc, char * argv[])
    {
    printf"DiskCount: %d\n", GetDiskCount());
    return 0;
    }

其实,原理很简单。就是通过proc文件系统获得。在proc文件系统中有一个名为partitions的文件。这个文件中包含本地磁盘的硬盘及分区信 息。根据Linux下设备命名规则,如果设备名的最后一个字符是数字就应该是分区,否则就是硬盘。于是,我们就可以轻而易举的知道电脑中有几个硬盘。
当然,根据这个文件,还可以知道硬盘设备名称以及每个硬盘中分区的数量和每个分区的设备名称。至于如何获取,大家应该都会的。
获取硬盘信息:
现在,我们已经可以知道硬盘数量、硬盘的设备名称、分区数及分区的设备名称。那么,怎么才能知道这些设备的信息呢?比如硬盘大小、扇区大小、分区大小、分区已经使用的大小等等。
关于硬盘的信息,在fdisk的源码中也可以找到相关的源码。实例代码如下:

     #include <stdio.h>
    #include <errno.h>
    int GetDiskCount()
    {
    FILE* f = fopen("/proc/partitions", "r");
    if (!f)
    {
    fprintf(stderr, "fopen /proc/partitions failed!errno=%d\n", errno);
    return 0;
    }
    char line[100], ptname[100], devname[120], *s;
    int ma, mi, sz;
    int nDiskCount = 0;
    while (fgets(line, sizeof(line), f))
    {
    if (sscanf(line, " %u %u %u %[^\n ]",
    &ma, &mi, &sz, ptname) != 4continue;
    fors = ptname; *s; s++)
    continue;
    /* note: excluding '0': e.g. mmcblk0 is not a partition name! */
    ifs[-1] >= '1' && s[-1] <= '9'continue;
    nDiskCount++;
    }
    fclose(f);
    return nDiskCount;
    }
    int main(int argc, char * argv[])
    {
    printf"DiskCount: %d\n", GetDiskCount());
    return 0;
    }

其实,就是通过打开设备文件然后分别调用ioctl来获取硬盘的大小、扇区大小、CHS信息等等。程序运行结果如下:
user:~/$sudo ./diskinfo /dev/sda
Disk /dev/sda infomation:
Size: 42949672960 Bytes 40.00 GB
SectorSize: 512 Bytes
heads: 255
sectors: 63
cylinders: 5221
start: 0

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐