Mauvais descripteur de fichier
J'apprends sur les descripteurs de fichier et j'ai écrit ce code:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int fdrd, fdwr, fdwt;
char c;
main (int argc, char *argv[]) {
if((fdwt = open("output", O_CREAT, 0777)) == -1) {
perror("Error opening the file:");
exit(1);
}
char c = 'x';
if(write(fdwt, &c, 1) == -1) {
perror("Error writing the file:");
}
close(fdwt);
exit(0);
}
mais je suis arriver: Error writing the file:: Bad file descriptor
Je ne sais pas ce qui pourrait être mauvais, puisque c'est un exemple très simple.
Qu'est-ce que le val de fdwt sur le retour de open( )? Il doit être un entier plus petit, moins de 5. En fait, parce qu'aucune autre fds sont ouverts dans ce code, il devrait être de 3 (c'est à dire, STDERR + 1).
Par ailleurs, votre code a plusieurs problématiques bits. Ces variables n'ont pas besoin d'être global (quelques jamais le faire), vous devez les déclarer dans
Vous devez les accepter une réponse!
Par ailleurs, votre code a plusieurs problématiques bits. Ces variables n'ont pas besoin d'être global (quelques jamais le faire), vous devez les déclarer dans
main
. Vous déclarez également que vous c
deux fois, vous n'avez pas besoin de la char
dans char c
la deuxième fois. Dans le même temps, la deuxième déclaration de c
dans le milieu de la fonction n'est valide que dans C99, mais vous déclarer main
sans type de retour -- ce qui n'est pas valide en C99, ce qui élimine le "implicite int" la règle qui était présent dans C89 et les versions antérieures de C. la Plupart des compilateurs doivent émettre des avertissements pour que, certains lèvera une erreur et refuse de compiler.Vous devez les accepter une réponse!
OriginalL'auteur Lucy | 2011-06-05
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Il vous a donné un descripteur de fichier, afin de l'ouvrir n'a pas manqué ... mais le descripteur n'est pas valide pour l'écriture.
3 ouvrez est ton ami dans ce cas 😉
J'irais avec
man 2 open
puisque c'est un appel système.OriginalL'auteur patapizza
Je pense que
O_CREAT
seul n'est pas suffisant. Essayez d'ajouterO_WRONLY
comme indicateur de la commande ouvrir.OriginalL'auteur RedX
Selon l'ouvrir(2) l'homme page:
Donc oui, comme suggéré par d'autres, s'il vous plaît changer votre
open
àopen("output", O_CREAT|O_WRONLY, 0777));
. UtilisationO_RDWR
si vous avez besoin de lire le fichier. Vous pouvez égalementO_TRUNC
- voir la page de manuel pour plus de détails.OriginalL'auteur spacehunt