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

我需要在Win和* nix机器上获得硬盘的规格。 我在Linux上使用<hdreg.h> ,如下所示:

  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; } 

我需要hd_driveid来告诉我一些关于磁盘的更多信息。 我想知道:

  • 分区数量
  • 每个分区的规格(格式,标签,标志,大小,起始点,轨道数量等)
  • 每缸的履带数量
  • 总轨道数
  • 最大块大小
  • 最小块大小
  • 默认块大小
  • 设备的总大小

我的问题是:

  1. 有没有一个共同的(平台无关)的方式来连接硬件? 我想为win和* nix使用相同的代码。 (即使除了将汇编代码embedded到cpp之外没有其他办法)
  2. 如果没有,我如何在* nix中获得以上信息?

Solutions Collecting From Web of "如何在Linux中使用C ++获取硬件信息"

几乎所有在您的列表中的东西都与“硬盘规格”无关:

  • 分区的数量取决于读取分区表,如果您有任何扩展分区,这些分区的分区表。 设备驱动程序加载时,操作系统通常会为你做这个事情。
  • 分区信息(即卷标)通常在分区表中不可用。 您需要猜测文件系统类型并解析文件系统头。 分区表中唯一的东西是“类型”字节,它不会告诉你所有的东西,以及开始/大小。
  • 硬盘不会给你“真正的”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计算的尺寸大几兆字节。

如果你告诉我们你为什么要这个信息,这可能会有所帮助。

不,没有平台无关的方式。 甚至没有* nix的方式。 只有Linux的方式。

在Linux中,所有相关的信息都可以在/proc文件系统的各种文件中找到。 /proc/devices会告诉你哪些设备存在(即使设备不可用, /dev/的文件也可能存在,尽管在这种情况下打开它们将失败), /proc/partitions会告诉你哪些分区是可用的在每个磁盘上,你将不得不在各个子目录中查看信息。 只要看看一些你需要的linux系统。

对于GNU / Linux有一个看看这个: 获取硬盘元数据

 //------------------------------------------------- // Without Boost LIB usage //------------------------------------------------- #include <sys/statvfs.h> #include <sys/sysinfo.h> //------------------------------------------------- stringstream strStream; unsigned long hdd_size; unsigned long hdd_free; ostringstream strConvert; //--- struct sysinfo info; sysinfo( &info ); //--- struct statvfs fsinfo; statvfs("/", &fsinfo); //--- //--- unsigned num_cpu = std::thread::hardware_concurrency(); //--- ifstream cpu_freq("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq"); strStream << cpu_freq.rdbuf(); std::string cpufrequency = strStream.str(); //--- strStream.str(""); ifstream cpu_temp("/sys/class/thermal/thermal_zone0/temp"); strStream << cpu_temp.rdbuf(); strConvert<< fixed << setprecision(2) << std::stof(strStream.str()); std::string cputemp = strConvert.str(); //--- std::string mem_size = to_string( (size_t)info.totalram * (size_t)info.mem_unit ); //--- hdd_size = fsinfo.f_frsize * fsinfo.f_blocks; hdd_free = fsinfo.f_bsize * fsinfo.f_bfree; //--- std::cout << "CPU core number ==" << num_cpu << endl; std::cout << "CPU core speed ==" << cpufrequency << endl; std::cout << "CPU temperature (C) ==" << cputemp << endl; //--- std::cout << "Memory size ==" << mem_size << endl; //--- std::cout << "Disk, filesystem size ==" << hdd_size << endl; std::cout << "Disk free space ==" << hdd_free << endl; //--- 
 //Piece of code working for me with Boost LIB usage //----------------------------------------------------- #include <sys/sysinfo.h> #include <boost/filesystem.hpp> //--- using namespace boost::filesystem; //--- struct sysinfo info; sysinfo( &info ); //--- space_info si = space("."); //--- unsigned num_cpu = std::thread::hardware_concurrency(); //--- ifstream cpu_freq("/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq"); ifstream cpu_temp("/sys/class/thermal/thermal_zone0/temp"); //--- std::string cpunumber = to_string(num_cpu); std::string cpufrequency = cpu_freq.str(); std::string cputemp = cpu_temp.str(); std::string mem_size = to_string( (size_t)info.totalram * (size_t)info.mem_unit ); std::string disk_available = to_string(si.available); std::string fslevel = to_string( (si.available/si.capacity)*100 ); //---