2016-08-11 2 views
0

Considérez le code suivant:ioctl() remet à zéro appel descripteur de fichier à 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); 

Ce rendements snippet ceci:

File descriptor: 3 
File descriptor after: 0 

Pourquoi mon descripteur de fichier get remis à 0? Le programme écrit les choses à stdout au lieu de mon périphérique de bloc.

Cela ne devrait pas arriver. Je m'attends à ce que mon file_fd soit différent de zéro et conserve sa valeur.

Répondre

2

On dirait que vous brisez votre pile.

Puisqu'il n'y a que deux variables de pile file_fd et DskSize et la modification DskSize change file_fd suggère que DiskSizeunsigned long doit être ou size_t (valeur de 64 bits), non uint32_t.

En regardant BLKGETSIZE implementation confirme que le type de valeur est unsigned long.

Vous pouvez exécuter vos applications sous valgrind, il signale ce genre d'erreurs.

+0

Alors que 'valgrind' n'a rien détecté, vous avez raison. Je passe l'adresse d'un entier de 4 octets à ioctl, et ioctl s'attend à écrire 8 octets, mais je n'ai alloué que 4. – Gala

+0

@Gala Je suis surpris que 'valgrind' ne le détecte pas. –