如何使用C++在Linux中获取硬件信息

2024-01-27

我需要获取 Win 和 *nix 机器上的硬盘规格。我用了<hdreg.h>在 Linux 上是这样的:

   static struct hd_driveid hd;
   int device;
   if ((device = open("/dev/sda", O_RDONLY | O_NONBLOCK)) < 0)
   {
      cerr << "ERROR: Cannot open device /dev/sda \n";
      exit(1);
   }

   if (!ioctl(device, HDIO_GET_IDENTITY, &hd))
   {
      cout << hd.model << endl;
      cout << hd.serial_no << endl;
      cout << hd.heads << endl;
   }

I need hd_driveid告诉我一些有关磁盘的更多信息。我想知道:

  • 分区数量
  • 每个分区的规格(格式、标签、标志、大小、起始点、磁道数等)
  • 每个气缸的磁道数
  • 总曲目数
  • 最大块大小
  • 最小块大小
  • 默认块大小
  • 设备总尺寸

我的问题是:

  1. 有没有一个共同点 (与平台无关)方式 连接硬件?我想使用 win 和 *nix 的代码相同。 (即使 没有别的办法了 将汇编代码嵌入到cpp中)
  2. 如果没有,如何在 *nix 中获取上述信息?

列表中的几乎所有内容都与“硬盘规格”无关:

  • 分区的数量取决于读取分区表,如果有扩展分区,则读取这些分区的分区表。当设备驱动程序加载时,操作系统通常会为您执行此操作。
  • 分区信息(即卷标)通常在分区表中不可用。您需要猜测文件系统类型并解析文件系统头。分区表中唯一的内容是“类型”字节(它不会告诉您太多信息)以及开始/大小。
  • 硬盘驱动器不会为您提供“真实的”CHS 信息。此外,从 BIOS 的角度来看,驱动器提供的 CHS 信息是“错误的”(BIOS 自己捏造的)。
  • 硬盘驱动器有固定的扇区大小,您可以使用它hd_driveid.sector_bytes(通常为 512,但某些现代驱动器使用 4096)。我不知道最大“块大小”,这是文件系统的属性。我也不确定为什么这有用。
  • 扇区的总大小为hd_driveid.lba_capacity_2。此外,以字节为单位的大小可能可以通过类似的方法获得

    #define _FILE_OFFSET_BITS 64
    #include <sys/types.h>
    #include <unistd.h>
    
    ...
    off_t size_in_bytes = lseek(device, 0, SEEK_END);
    if (size_in_bytes == (off_t)-1) { ... error, error code in ERRNO ... }
    

    请注意,在这两种情况下,它可能比 C×H×S 计算的大小大几兆字节。

如果您告诉我们您想要此信息的原因可能会有所帮助......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用C++在Linux中获取硬件信息 的相关文章

随机推荐