如何在 Linux 中使用 C++ 获取硬件信息
我需要获取 Win 和 *nix 机器上的硬盘规格。我在 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;
}
我需要 hd_driveid
来告诉我有关磁盘的更多信息。我想知道:
- 分区数
- 每个分区的规格(格式、标签、标志、大小、起始点、磁道数等)
- 每个柱面的磁道数
- 总磁道数
- 最大块大小
- 最小块大小
- 默认块大小
- 总大小 我的问题
是:
- 有一个共同的 (与平台无关)方式 连接硬件?我想使用 win 和 *nix 的代码相同。 (即使 没有别的办法了 将汇编代码嵌入到cpp中)
- 如果没有,我如何在*nix中获取上述信息?
I need to get specifications of hard disk on both Win and *nix machines. I used <hdreg.h>
on Linux like this:
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
to tell me some more information about disk. I want to know:
- Number of partitions
- Specifications of each partition (format, label, flags, size, start point, number of tracks etc.)
- Number of tracks per cylinder
- Number of total tracks
- Maximum block size
- Minimum Block size
- Default block size
- Total size of device
My questions are:
- Is there a common
(platform-independent) way to
connect hardware? I would like use
same code for win and *nix. (even if
there was no way other than
embedding assembly code into cpp) - If there isn't, how do I get above information in *nix?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
列表中的几乎所有内容都与“硬盘规格”无关:
扇区总大小位于
hd_driveid.lba_capacity_2
中。此外,以字节为单位的大小可能可以通过类似的方法获得<前><代码>#define _FILE_OFFSET_BITS 64;;
#include
#include
...
off_t size_in_bytes = lseek(设备, 0, SEEK_END);
if (size_in_bytes == (off_t)-1) { ... 错误,错误代码为 ERRNO ... }
请注意,在这两种情况下,它可能比 C×H×S 计算的大小大几兆字节。
如果您告诉我们您想要此信息的原因可能会有所帮助......
Nearly everything in your list has nothing to do with "specifications of hard disk":
hd_driveid.sector_bytes
(usually 512, but some modern drives use 4096). I'm not aware of a maximum "block size", which is a property of the filesystem. I'm also not sure why this is useful.The total size in sectors is in
hd_driveid.lba_capacity_2
. Additionally, the size in bytes can probably be obtained with something likeNote that in both cases, it'll probably be a few megabytes bigger than sizes calculated by C×H×S.
It might help if you told us why you wanted this information...
不,不存在独立于平台的方式。甚至没有 *nix 方式。只有 Linux 的方式。
在 Linux 中,所有相关信息都可以在
/proc
文件系统中的各个文件中找到。/proc/devices
会告诉你有哪些设备(即使设备不可用,/dev/
中的文件也可能存在,但打开它们会失败)情况),/proc/partitions
将告诉您每个磁盘上有哪些可用分区,并且您必须在各个子目录中查找信息。只要在某个 Linux 系统上看看哪里有你需要的。No, there is no platform-independent way. There is even no *nix way. There is just Linux way.
In Linux, all relevant information is available in various files in the
/proc
filesystem. The/proc/devices
will tell you what devices there are (the files in/dev/
may exist even when the devices are not available, though opening them will fail in that case),/proc/partitions
will tell you what partitions are available on each disk and than you'll have to look in the various subdirectories for the information. Just look around on some linux system where is what you need.对于 GNU/Linux,请查看以下内容:获取硬盘元数据
For GNU/Linux have a look at this: obtaining hard disk metadata