Existe-t-il un moyen de synchroniser parent et enfant en C en utilisant un tube sous Unix?

StackOverflow https://stackoverflow.com/questions/1422441

  •  07-07-2019
  •  | 
  •  

Question

Supposons que le parent et l’enfant utilisent un même canal pour écrire et lire, cela signifie que lorsque l’on écrit, on ne lit que les autres lectures, sinon on les bloque. Y a-t-il un moyen de le faire? J'ai essayé de le faire avec la fonction de veille, mais à cause des conditions de course, cela ne donne pas la sortie correcte. Ceci est mon code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

#define MSGSIZE 16
main ()
{
  int i;
  char *msg = "How are you?";
  char inbuff[MSGSIZE];
  int p[2];
  pid_t ret;
  pipe (p);
  ret = fork ();
  if (ret > 0)
    {
      i = 0;
      while (i < 10)
        {
          write (p[1], msg, MSGSIZE);
          sleep (2);
          read (p[0], inbuff, MSGSIZE);
          printf ("Parent: %s\n", inbuff);
          i++;
        }
    exit(1);
    }
  else
    {
      i = 0;
      while (i < 10)
        {
          sleep (1);
          read (p[0], inbuff, MSGSIZE);
          printf ("Child: %s\n", inbuff);
          write (p[1], "i am fine", strlen ("i am fine"));
          i++;
        }
    }
  exit (0);
}
Était-ce utile?

La solution

Le tube () crée deux archiveurs de fichiers, un pour la lecture et l’autre pour l’écriture. Pour une communication bidirectionnelle, vous devez créer deux canaux (quatre archiveurs de fichiers).

Autres conseils

Vous ne pouvez pas effectuer de synchronisation bidirectionnelle sur un seul tuyau.

Vous pouvez effectuer une synchronisation bidirectionnelle sur un socket de domaine Unix.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top