请考虑以下代码:
file_fd = open(device, O_RDWR);
if (file_fd < 0) {
perror("open");
return -1;
}
printf("File descriptor: %d\n", file_fd);
uint32_t DskSize;
if (ioctl(file_fd, BLKGETSIZE, &DskSize) < 0) {
perror("ioctl");
return -1;
}
printf("File descriptor after: %d\n", file_fd);
这个片段产生了这个:
File descriptor: 3
File descriptor after: 0
为什么我的文件描述符被重置为0?程序将内容写入stdout
而不是我的块设备。
这不应该发生。我希望我的file_fd
不为零并保留其值。
答案 0 :(得分:2)
看起来你粉碎了你的筹码。
由于只有两个堆栈变量file_fd
和DskSize
,并且更改DskSize
更改file_fd
表明DiskSize
必须为unsigned long
或{ {1}}(64位值),而不是size_t
。
查看BLKGETSIZE
implementation确认值类型为uint32_t
。
您可能希望在unsigned long
下运行您的应用程序,它会报告此类错误。