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:
Un "client" peut utiliser cette fifo pour lui passer des données:
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 //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); }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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);
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.
Partager