我需要获取 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
告诉我一些有关磁盘的更多信息。我想知道:
- 分区数量
- 每个分区的规格(格式、标签、标志、大小、起始点、磁道数等)
- 每个气缸的磁道数
- 总曲目数
- 最大块大小
- 最小块大小
- 默认块大小
- 设备总尺寸
我的问题是:
- 有没有一个共同点
(与平台无关)方式
连接硬件?我想使用
win 和 *nix 的代码相同。 (即使
没有别的办法了
将汇编代码嵌入到cpp中)
- 如果没有,如何在 *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(使用前将#替换为@)