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.