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_fd
和DskSize
并且更改DskSize
更改file_fd
表明DiskSize
必须是unsigned long
或 size_t
(64 位值),而不是 uint32_t
.
查看BLKGETSIZE
implementation确认值类型为unsigned long
。
您可能喜欢 运行 您的应用程序在 valgrind
下,它会报告此类错误。
考虑以下代码:
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_fd
和DskSize
并且更改DskSize
更改file_fd
表明DiskSize
必须是unsigned long
或 size_t
(64 位值),而不是 uint32_t
.
查看BLKGETSIZE
implementation确认值类型为unsigned long
。
您可能喜欢 运行 您的应用程序在 valgrind
下,它会报告此类错误。