ioctl()调用将文件描述符重置为0

时间:2016-08-11 10:48:27

标签: linux ioctl

请考虑以下代码:

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不为零并保留其值。

1 个答案:

答案 0 :(得分:2)

看起来你粉碎了你的筹码。

由于只有两个堆栈变量file_fdDskSize,并且更改DskSize更改file_fd表明DiskSize必须为unsigned long或{ {1}}(64位值),而不是size_t

查看BLKGETSIZE implementation确认值类型为uint32_t

您可能希望在unsigned long下运行您的应用程序,它会报告此类错误。