Forum Linux.général probleme de compréhension sur les tubes nommés

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
1
7
août
2020

Bonjour à tous,

via la commande mkfifo j'ai crée un fichier pipe : mkfifo /tmp/myPipeNamed. Puis ensuite à travers deux terminaux j'ai ouvert ce fichier :
cat /tmp/myPipeNamed (sur chaque terminal)

puis via le code :
int main(int argc, char const *argv[])
{

    int pipeNamed_fd = open("/tmp/myPipeNamed", O_WRONLY);

    char buffer[256];
    while(1)
    {        
        write(1,"ecrivez quelque chose : ", 24);
        int byteReceivedFromKeyboard = read(0, buffer, 256);
        buffer[byteReceivedFromKeyboard  - 1] = '\0'; //on remplace le retour chariot \n par \0
        write( pipeNamed_fd, buffer, strlen( buffer ));
    }

    close(pipeNamed_fd);

    return 0;
}

ce qui me pose probleme c'est que le message que j'envoie au fichier /tmp/myPipeNamed est recu aléatoirement sur un de mes terminals ou j'ai lancé la commande : cat /tmp/myPipeNamed
alors que je m'attendais a ce que chaque terminal recoit le message car ils sont tous les deux a l'écoute du fichier pipe. Il semblerait que le noyau ne transmet le message juste à un seul receveur, mais pourquoi faire ca ?

Merci de votre aide

  • # Premier arrivé, premier servi

    Posté par  . Évalué à 2.

    Le premier cat qui lit le pipe le vide, le second tombe sur EOF : (man pipe.7)

    If all file descriptors referring to the write end of a pipe have been closed, then an attempt to read(2) from the pipe will see end-of-file (read(2) will return 0).

    Pas besoin de passer par un programme C pour voir ça d'ailleurs : tu peux le remplacer par un echo 'texte' >/tmp/myPipeNamed dans un autre terminal.

  • # Un pipe c'est entre deux processus

    Posté par  (site Web personnel) . Évalué à 4.

    alors que je m'attendais a ce que chaque terminal recoit le message car ils sont tous les deux a l'écoute du fichier pipe. Il semblerait que le noyau ne transmet le message juste à un seul receveur, mais pourquoi faire ca ?

    Un pipe c'est rediriger une sortie d'un programme vers l'entrée d'une autre. Cela est utile pour modulariser des traitements ou appliquer des filtres sur du texte successivement par exemple.

    Donc de fait pour un pipe il y a un processus qui émet en entrée et un seul qui récupère les données en sortie. Sinon, tu observe des comportements étranges comme celui que tu as où deux processus accèdent à des portions de la sortie suivant l'état du buffer du pipe et l'ordonnancement du système d'exploitation.

    Il existe après des outils et méthodes pour dupliquer le pipe (et donc une émission en entrée puisse être lue comme tu l'attends par X processus derrière) mais ce n'est pas le comportement standard d'un pipe qui est plus élémentaire que ça.

  • # Commentaire supprimé

    Posté par  . Évalué à 1. Dernière modification le 22/08/20 à 10:57.

    Ce commentaire a été supprimé par l’équipe de modération.

    • [^] # Commentaire supprimé

      Posté par  . Évalué à 1. Dernière modification le 22/08/20 à 10:56.

      Ce commentaire a été supprimé par l’équipe de modération.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.