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

Bibliothèque standard C Discussion :

pipe et synchronisation


Sujet :

Bibliothèque standard C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Par défaut pipe et synchronisation
    Bonjour,

    Dans le livre de Stevens et Rago, ils donnent l'exemple de programme suivant pour illustrer comment fonctionnent les pipes:
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
     
    int main(void)
    {
      int n;
      int fd[2];
      pid_t pid;
      char line[4096];
     
      if (pipe(fd)<0)
        printf("pipe error");
      if ((pid = fork()) < 0){
        printf("fork error");
      } else if (pid >0)
        {
     
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
     
        } else {
     
            close (fd[1]);
        n = read(fd[0], line, 4096);
        write(STDOUT_FILENO, line, n);
     
     }
    exit(0);
     
     
    }
    Je ne comprenais pas pourquoi close(fd[1]) est mis au début du fils au lieu d'être mis à la fin du père. J'ai donc modifié le programme ainsi (il faut dé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
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
     
    int main(void)
    {
      int n;
      int fd[2];
      pid_t pid;
      char line[4096];
     
      if (pipe(fd)<0)
        printf("pipe error");
      if ((pid = fork()) < 0){
        printf("fork error");
      } else if (pid >0)
        {waitpid(pid, NULL, 0);
          printf("père");   
          /*
        close(fd[0]);
        write(fd[1], "hello world\n", 12);
          */
        } else {printf("fils");
        /*
            close (fd[1]);
        n = read(fd[0], line, 4096);
        write(STDOUT_FILENO, line, n);
        */
     }
    exit(0);
     
     
    }
    Je voulais forcer le fils à s'exécuter en premier. Je n'y suis pas arrivé! Le programme n'écrit jamais "fils"! En revanche, si j'exécute le programme en commentant comme je l'ai fait (c'est-à-dire sans close, ni write ni read), il écrit bien "fils" puis "père". C'est pour moi un mystère. Quelqu'un a-t-il une explication? Merci d'avance.

  2. #2
    Membre expérimenté Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Par défaut
    Essaye de mettre:
    printf("fils\n");
    (le '\n' vide le buffer de stdout)

    Car en fait ton programme va se bloquer en effet dans le père tu fais:
    waitpid(pid, NULL, 0);
    Donc la première instruction du père est d'attendre la mort de son fils
    Or dans le fils tu demandes de lire dans le tube:
    n = read(fd[0], line, 4096);
    Alors que rien a été écrit dans le tube(le pere attend toujours la mort de son fils et est bloqué à l'instruction "waitpid()"), le read est alors bloquant pour le fils. Les deux process sont bloqués ->programme planté!

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/10/2009, 18h50
  2. Synchronisation verticale
    Par hs_dino dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/09/2003, 09h35
  3. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  4. Synchronisation de base de données locale/distante Internet
    Par StefC30 dans le forum Développement
    Réponses: 3
    Dernier message: 25/07/2003, 14h47
  5. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 11h06

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