2016-08-11 3 views
0

Рассмотрим следующий код:IOCTL() вызов сбрасывает дескриптор файла в 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 будет отличным от нуля и сохранит его значение.

ответ

2

Похоже, вы разбиваете свой стек.

Поскольку существуют только две переменные стека file_fd и DskSize и изменение DskSize изменяет file_fd предполагает, что должны быть DiskSizeunsigned long или size_t (64-битное значение), а не uint32_t.

Глядя на BLKGETSIZE implementation, подтверждает, что тип значения unsigned long.

Возможно, вы захотите запустить приложения под номером valgrind, он сообщает об ошибках такого типа.

+0

Хотя 'valgrind' ничего не обнаружил, вы правы. Я передаю адрес целого числа из 4 байтов в ioctl, а ioctl рассчитывает записать 8 байтов, но я выделил только 4. – Gala

+0

@Gala. Я удивлен, что 'valgrind' не обнаруживает его. –