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

POSIX C Discussion :

Problème avec fgets et tube...


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Problème avec fgets et tube...
    Lu à tous,
    je vais essayé d'être bref.
    Bon en fait je voulais juste montrer un exemple de tube à mon pote et je suis tombé sur erreur que je n'arrive pas à comprendre.

    Voici le code j'ai essayé de bien le commenter :
    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
    36
    37
    38
    39
     
    int main(int argc, char **argv)
    {
      pid_t pid; 
      int tube[2]; 
      char line[128]; 
     
      pipe(tube);           
     
      pid = fork();         
     
      if (pid == 0)
        {
          //Je suis dans mon fils
          close(tube[1]);   
          //Je remplace le descripteur de l'entrée standard par la sortie du tube
          dup2(tube[0], STDIN_FILENO);
          //J'attend que quelque chose arrive dans mon tube
          fgets(line, 128, stdin);    
          //J'affiche le contenu de ce que j'ai lu
          printf("Recu : %s\n", line); 
          close(tube[0]); 
        }
      else
        {
          //Je suis dans le pere
          close(tube[0]); 
          //Je remplace le descripteur de la sortie standard par l'entrée du tube
          dup2(tube[1], STDOUT_FILENO); 
          //Je balance dans le tube cette chaine
          printf("Coucou je teste mon tube\n");
          //J'attend que mon fils se termine et je récupère son pid
          pid = wait(NULL);
          //J'affiche le pid de mon unique fils
          fprintf(stderr, "Le fils num : %d\n", pid); 
        }
     
      return(EXIT_SUCCESS); 
    }
    Donc en gros ce que je comprends pas c'est que le fils se blque sur le fgets et que par conséquent le père attend la fin de son fils indéfiniment.
    D'autre part si j'enlève le wait() tout se passe bien et pareil si à la place de fgets/printf j'utilise read/write tout en laissant le wait() à ce moment là.

    Bon ben si quelqu'un à une idée je suis preneur.
    Merci d'avance.
    @++.

  2. #2
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut
    Pourquoi tu ferais pas un fdopen plutôt que ton dup2 ?

    Et peut être qu'en fermant tube[0] dans le fils à la fin tu casses le tube ! dans ce cas le père ne peux pas lire.

    Sinon ton wait tu devrais mettre un waitpid plutôt.
    Enfin je trouve que c'est bizarre comme exemple.

    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
    int main(void)
    {
       int tube[2];
       char ligne[128];
       FILE *lect;
       FILE *ecr;
     
       pipe(tube);
     
       if (fork() = 0)
       {
          close(tube[1]);
          lect = fdopen(tube[0]);
          fgets(ligne,128,lect);
          printf("Recu : %s\n", line); 
     
          return 0; 
        } 
     
        close(tube[0]);
        ecr = fdopen(tube[1]);
        fprintf(ecr,"Coucou je teste mon tube\n"); 
     
        return(EXIT_SUCCESS); 
    }
    ça doit marcher ça.
    Tom

  3. #3
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Il te suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("Coucou je teste mon tube\n"); 
    fflush(NULL);
    Il faut faire le fflush. (ou utilise un read pour le test sinon)
    Sinon tu peux faire le close juste apres le dup2 (c'est un conseil) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dup2(tube[1], STDOUT_FILENO); 
    close(tube[1]);

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Merci pour toutes ces idées je vais booter sur debian et je vous donne le résultat...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2003
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Bon je suis de retour.
    nyal j'ai essayé ton coup de fflush() aprés printf et ca marche bien.
    En revanche si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("Coucou je teste mon tube"); //sans le '\n'
    fflush(NULL);
    Ben dans ce cas la ca ne marche pas.
    Aurez tu une explication.

    De plus si du côté fils je décide de récupérer les données avec un fread tout en laissant dans le père :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("Coucou je teste mon tube\n"); 
    fflush(NULL);
    Ben ca ne marche plus non plus.
    Donc là il y a un gros truc que j'ai du zapper.

    Voilà en attente de réponse merci.

  6. #6
    Membre habitué Avatar de Metal Tom
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 119
    Points : 129
    Points
    129
    Par défaut
    fgets attend un caractère '\n' il me semble ou bien une chaine de la longueur que tu lui a donné en deuxième argument.

    Dans tous les cas si tu veux étudier le comportement de ton programme récupères les valeurs des fonctions comme fork, fgets, pipe, etc. Et utilise des perror. Ca aide à comprendre souvent.
    Tom

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec fgets
    Par kadd18 dans le forum C
    Réponses: 3
    Dernier message: 28/07/2009, 19h58
  2. Probléme avec fgets
    Par Lucas42 dans le forum C
    Réponses: 2
    Dernier message: 18/11/2007, 03h08
  3. Problème avec fgets() et strlen()
    Par condor_01 dans le forum C
    Réponses: 6
    Dernier message: 28/10/2007, 12h41
  4. Problème avec fgets
    Par fabpeden dans le forum C
    Réponses: 13
    Dernier message: 15/05/2007, 10h25
  5. problème avec fgets
    Par salseropom dans le forum C
    Réponses: 1
    Dernier message: 03/08/2006, 14h54

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