ioctl и hdreg для получения информации о жестких дисках

Я хочу получить основную информацию с жесткого диска и распечатать ее. Самое главное, что размер физического сектора правильный.

Последние несколько часов я боролся с 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 *’

Я надеюсь, что кто-то может объяснить мне, что идет не так!

1 ответ

Решение

Вместо

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

ты наверное хочешь

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

Так как ioctl Первый аргумент должен быть целочисленным дескриптором файла, а не FILE *

fileno() даст вам целое число от FILE *,

Обратите внимание, что ioctl возвращает -1 при ошибке и устанавливает errno.

Чтение справочных страниц по функциям, которые вы используете, возможно, быстрее, чем публикация в Stackru.

Смотрите справочные страницы ioctl, fileno.

Другие вопросы по тегам