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

ioctl() call resets file descriptor to 0

考虑以下代码:

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

看起来你砸了你的筹码。

由于只有两个堆栈变量file_fdDskSize并且更改DskSize更改file_fd表明DiskSize必须是unsigned longsize_t(64 位值),而不是 uint32_t.

查看BLKGETSIZE implementation确认值类型为unsigned long

您可能喜欢 运行 您的应用程序在 valgrind 下,它会报告此类错误。