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 : 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);
    }
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
 
//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.