我想从硬盘中获取基本信息并打印出来。最重要的是物理扇区大小正确。
在过去的几个小时中,我一直在与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更快。
请参见ioctl,fileno的手册页。
关于c - ioctl和greg在硬盘上获取信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20291022/