我想从硬盘中获取基本信息并打印出来。最重要的是物理扇区大小正确。

在过去的几个小时中,我一直在与ioctl战斗以获得想要的东西,但我无法弄清楚。

我以前从未使用过ioctl,而且似乎找不到关于您必须做什么的简单解释。

无论如何我的代码看起来像这样

int main () {
    FILE *driveptr;
    int sectorsize;
    struct hd_driveid hd;

    driveptr=fopen("/dev/sda","r");

    if (ioctl(driveptr,HDIO_GET_IDENTITY, &hd)!=0) {
        printf("Hard disk model: %s\n",hd.model);
        printf("Serial number: %s\n",hd.serial_no);
        printf("Sector size: %i\n",hd.sector_bytes);
        sectorsize=hd.sector_bytes;
    } else {
        printf("Error fetching device data.\n");
    }
}


在编译器中,它会抛出这些警告,但会进行编译,但在打印时字符串为空。

gcc -o test source.c
source.c: In function ‘main’:
source.c:67:9: warning: passing argument 1 of ‘ioctl’ makes integer from pointer without a cast [enabled by default]
/usr/include/x86_64-linux-gnu/sys/ioctl.h:42:12: note: expected ‘int’ but argument is of type ‘struct FILE *’


我希望有人可以向我解释出了什么问题!

最佳答案

代替

if (ioctl(driveptr,HDIO_GET_IDENTITY, &hd)!=0) {


你可能想要

if (ioctl(fileno(driveptr),HDIO_GET_IDENTITY, &hd)!= -1) {
          ^^^^^^^        ^                           ^^


因为ioctl的第一个参数需要是整数文件描述符,而不是FILE *

fileno()将为您提供FILE *的整数fd。

另请注意,ioctl在错误时返回-1并设置errno。

阅读正在使用的功能的手册页可能比发布到StackOverflow更快。

请参见ioctlfileno的手册页。

关于c - ioctl和greg在硬盘上获取信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20291022/

10-10 03:58
查看更多