IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

write et bad file descriptor


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Points : 32
    Points
    32
    Par défaut write et bad file descriptor
    bonjour

    devant ouvrir un fichier pour y ecrire en utilisant la norme posix pour la portabilite (contrainte du projet) le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char* argv[]) {
     
    	char* s = "un message";
     
    	printf("%s\n", argv[1]);
    	int fd = (int)fopen(argv[1], "r");
     
     
    	fprintf(stderr, "%s\n", strerror(errno));
    	printf("fd %d\n", fd);
     
     
    	int res = write(fd, s, 2);
    	printf("res %d\n", res);
    	fprintf(stderr, "%s\n", strerror(errno));
     
    	return 0;
    }
    compile et me renvois, a l'execution (avec :mon_exe mon_fichier), le message suivant:
    mon_fichier
    fd 1...4
    res -1
    Bad file descriptor

    Si qlq'un connait la raison de ce probleme par avance merci

  2. #2
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 508
    Points : 1 007
    Points
    1 007
    Par défaut
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fd = (int)fopen(argv[1], "r");

    "r" veut dire lecture, pas écriture; avec "w" je pense que se sera mieux

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par bpy1401 Voir le message
    bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fd = (int)fopen(argv[1], "r");

    "r" veut dire lecture, pas écriture; avec "w" je pense que se sera mieux
    oui c'est vrai mais cela ne change rien (c'etait une erreur de recopie entre ma partie de code de lecture ecriture)

    le message est maintenant le suivant

    mon_fichier
    No error
    fd 1...4
    res -1
    Bad file descriptor

    donc d'apres le "code d'erreur" le file descriptor est valide non?

  4. #4
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 508
    Points : 1 007
    Points
    1 007
    Par défaut
    Bonjour Torx26

    Exact, je n'avais pas lu correctement ton code.

    le fopen return un pointeur sur une structure FILE, il ne peut donc pas être caster sur un int (Cela compile, mais ne fonctionne pas lorsque tu fait ton write).

    j'ai modifier ton code pour que cela fonctionne mieux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include <stdio.h>
    #include <sys/types.h>
    //#include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char* argv[]) {
     
    	char* s = "un message";
    	FILE * fd;
     
    	printf("%s\n", argv[1]);
    	fd = fopen(argv[1], "w");
     
     
    	fprintf(stderr, "%s\n", strerror(errno));
    	printf("fd %d\n", fd);
     
        {
    	  int res = fwrite(s, 1, sizeof(fd), fd);
    	  printf("res %d\n", res);
    	  fprintf(stderr, "%s\n", strerror(errno));
        }
     
    	return 0;
    }
    Je passe par un fwrite au lieu du write. Si tu souhaite conservé ton write, passe par un open.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 96
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par bpy1401 Voir le message
    Je passe par un fwrite au lieu du write. Si tu souhaite conservé ton write, passe par un open.
    Merci pour vous pencher sur mon cas

    en modifiant pour avoir un write (contrainte du projet), cela donne le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    #include <stdio.h>
    #include <sys/types.h>
    //#include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char* argv[]) {
     
    	char* s = "un message";
    	FILE * fd;
     
    	printf("%s\n", argv[1]);
    	fd = open(argv[1], O_WRONLY);
    	//fd = fopen(argv[1], "w");
     
    	fprintf(stderr, "%s\n", strerror(errno));
    	printf("fd %d\n", fd);
     
        {
     
    	  int res = write(fd, s, sizeof(fd)); 
    	  //int res = fwrite(s, 1, sizeof(fd), fd);
    	  printf("res %d\n", res);
    	  fprintf(stderr, "%s\n", strerror(errno));
     
        }
     
    	return 0;
    }
    il y a des warning pour les cast int <- FILE*

    et me viens 2 questions:
    comment faire pour caste les FILE* en int car la structure FILE* est la suivante,
    typedef struct {
    int level; /* fill/empty level of buffer */
    unsigned flags; /* File status flags */
    char fd; /* File descriptor */
    unsigned char hold; /* Ungetc char if no buffer */
    int bsize; /* Buffer size */
    unsigned char *buffer; /* Data transfer buffer */
    unsigned char *curp; /* Current active pointer */
    unsigned istemp; /* Temporary file indicator */
    short token; /* Used for validity checking */
    } FILE

    la seconde est que votre code compile et me donne le resultat attendu mais ce qui me surprende c'est: sizeof(fd), dans le fwrite, qui donne la taille en octet du message a ecrire cela veux-t-il dire qu'un file descriptor "porte" la taille (bsize)?

  6. #6
    Membre éprouvé
    Avatar de bpy1401
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2003
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2003
    Messages : 508
    Points : 1 007
    Points
    1 007
    Par défaut
    Comme tu dois utiliser un write et un open, maintenant ce n'est plus un FILE * que tu dois utiliser, mais directement un int.

    le fopen te renvoie un pointeur de type structure FILE.
    le open te renvoie un int .

    Pour le sizeof(fd), j'ai mis cela juste pour tester que l'on écrivait bien quelque chose, mais cela n'a pas de sens particulier. n'en tiens pas compte pour ton soft. Comme tu écrit une chaine, je l'ai remplacé par un strlen.

    j'ai aussi ajoute #include <io.h> et la ligne close(fd);

    voici le nouveau code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include <stdio.h>
    #include <io.h>
    #include <sys/types.h>
    //#include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char* argv[]) {
     
    	char* s = "un message";
    	int fd;
     
    	printf("%s\n", argv[1]);
    	fd = open(argv[1], O_CREAT | O_WRONLY);
    	//fd = fopen(argv[1], "w");
     
    	fprintf(stderr, "%s\n", strerror(errno));
    	printf("fd %d\n", fd);
     
        {
     
    	  int res = write(fd, s, strlen(s)); 
    	  //int res = fwrite(s, 1, sizeof(fd), fd);
    	  printf("res %d\n", res);
    	  fprintf(stderr, "%s\n", strerror(errno));
     
        }
    	close(fd);
     
    	return 0;
    }

Discussions similaires

  1. Bad file descriptor lors d'un write().
    Par gregb34 dans le forum Bibliothèque standard
    Réponses: 1
    Dernier message: 24/04/2008, 17h56
  2. Réponses: 0
    Dernier message: 18/11/2007, 20h53
  3. Erreur: bad file descriptor
    Par Bruno51 dans le forum Langage
    Réponses: 10
    Dernier message: 06/09/2007, 16h44
  4. Bad file descriptor avec un read()
    Par je®ome dans le forum C
    Réponses: 2
    Dernier message: 04/04/2006, 19h30
  5. Etrange "Bad file descriptor"
    Par amauryxiv dans le forum Langage
    Réponses: 23
    Dernier message: 01/02/2006, 03h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo