Existe-t-il un moyen de synchroniser parent et enfant en C en utilisant un tube sous Unix?
-
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);
}
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.