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

  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