pipe nommé read boucle de façon infinie
Bonjour,
j'ai besoin d'utiliser un pipe nommé dans une application. Chose que je n'ai jamais mis en oeuvre.
J'ai donc un processus en attente de données de la part d'autres processus via une fifo:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
//Créer un pipe nommé
retour = mkfifo("echange.fifo", 0644);
if(retour < 0)
{
perror("mkfifo");
exit(-1);
}
//Ouvrir le pipe nommé en lecture
fd_fifo = open("echange.fifo", O_RDONLY);
if(fd_fifo < 0)
{
perror("open fifo");
exit(-3);
}
//Attendre que des données arrivent dans la FIFO (nom + code)
while(1)
{
//bloquer sur la lecture
read(fd_fifo, data, sizeof(data));
printf("FIFO receive: %s\n", data);
} |
Un "client" peut utiliser cette fifo pour lui passer des données:
Code:
1 2 3 4 5 6 7 8 9 10 11
|
//Utiliser le pipe nommé relié au processus d'identification pour lui passer nom et code
fd_fifo = open("echange.fifo", O_WRONLY);
if(fd_fifo < 0)
{
perror("open fifo");
exit(-2);
}
write(fd_fifo, argv[1], strlen(argv[1])+1);
write(fd_fifo, argv[2], strlen(argv[2])+1);
close(fd_fifo); |
Mon processus lecteur reçoit bien le contenu des deux write. Mais la boucle while(1) tourne ensuite en permanence sur la lecture du dernier message reçu SAUF si je ne fais pas le close(fd_fifo) côté écrivain.
Je ne comprend pas pourquoi le dernier read ne vide pas complètement la fifo.
Pourquoi est-ce que close() perturbe la lecture?
Merci de vos réponses.