ioctl:HDIO_GET_IDENTITYのパラメータが無効です。

ioctl:HDIO_GET_IDENTITYのパラメータが無効です。

私はハードドライブの詳細を取得するプログラムを書いていますHDIO_ ioctl calls

プログラムを書くことはDocumentation/ioctl/hdio.txtカーネルソースコード(2.6.32)から。

これは私のコードの主要部分です。

fd = open("/dev/sda", O_RDONLY);  // validated fd.
retval = ioctl(fd, HDIO_GET_IDENTITY, &driveid);
if(retval < 0) {
            perror("ioctl(HDIO_GET_IDENTITY)");
            exit(3);
}

上記のコードをrootとして実行すると、次のエラーが発生します。

ioctl(HDIO_GET_IDENTITY): Invalid argument

プログラムに問題はありませんか?なぜエラーが発生するのですか?

追加情報:OS:、CentOS-6.5カーネルバージョン:2.6.32、IA:(x86_64VMwareで実行中)

結果hdparm -i /dev/sda

SG_IO: bad/missing sense data, sb[]:  70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
HDIO_GET_IDENTITY failed: Invalid argument

答え1

/dev/sdaシステムにデバイスがありますか? Driveid変数はどのようなタイプですか?完全なコードを表示するか、ドライブIDを次のように変更してみてください。

struct hd_driveid driveid;

その後、内容を印刷できます。つまり:

printf("Firmware Revision=%.8s\n",driveid.fw_rev);
printf("Cylinders=%d\n",driveid.cyls);

また確認して下さい: http://lxr.free-electrons.com/source/include/linux/hdreg.h?v=2.6.32

関連情報