Linux C编程:如何获取设备的分区信息?

bri*_*ght 6 c linux

我是Linux c编程的新手,有没有可以获取设备分区信息的API?

Pet*_*ter 8

Akash Rawal的答案非常接近.一个好方法是使用libblkid.

这是获取分区的uuid的示例:使用libblkid查找分区的UUID.

我将上面显示的代码和libblkid参考菜单中的示例结合起来并生成以下工作程序:

#include <stdio.h>
#include <string.h>
#include <err.h>
#include <blkid/blkid.h>


int main (int argc, char *argv[]) {
   blkid_probe pr = blkid_new_probe_from_filename(argv[1]);
   if (!pr) {
      err(1, "Failed to open %s", argv[1]);
   }

   // Get number of partitions
   blkid_partlist ls;
   int nparts, i;

   ls = blkid_probe_get_partitions(pr);
   nparts = blkid_partlist_numof_partitions(ls);
   printf("Number of partitions:%d\n", nparts);

   if (nparts <= 0){
      printf("Please enter correct device name! e.g. \"/dev/sdc\"\n");
      return;
   }

   // Get UUID, label and type
   const char *uuid;
   const char *label;
   const char *type;

   for (i = 0; i < nparts; i++) {
      char dev_name[20];

      sprintf(dev_name, "%s%d", argv[1], (i+1));

      pr = blkid_new_probe_from_filename(dev_name);
      blkid_do_probe(pr);

      blkid_probe_lookup_value(pr, "UUID", &uuid, NULL);

      blkid_probe_lookup_value(pr, "LABEL", &label, NULL);

      blkid_probe_lookup_value(pr, "TYPE", &type, NULL);

      printf("Name=%s, UUID=%s, LABEL=%s, TYPE=%s\n", dev_name, uuid, label, type);

   }

   blkid_free_probe(pr);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

用法:

gcc -o getuuid getuuid.c -lblkid
sudo ./getuuid /dev/sdc
Number of partitions:1
Name=/dev/sdc1, UUID=754A-CE25, LABEL=KINGSTON, TYPE=vfat
Run Code Online (Sandbox Code Playgroud)


hol*_*eek 0

我不知道有任何 API 可以做到这一点。

ldd `which fdisk`这样做了,但它没有显示任何与读取分区表有关的库,所以我假设它是自己完成的。

快速浏览一下fdisk程序的源代码进一步让我确信它没有使用任何外部库。

如果您热衷于自己解决问题并自学,我建议您这样做:

  1. 阅读有关MBR的维基百科页面。
  2. 获取源代码fdisk并阅读代码。