Les | - Juuujuuu/Pipex GitHub Wiki
Un pipe permet à deux processus de s'échanger des données. Les commandes Shell permettent de créer facilement un pipe :
envoyeur | receveur
Dans cet exemple, la sortie standard (stdout) de 'envoyeur' est reliée à l'entrée standard (stdin) de 'receveur'.
Les tubes ou pipes permettent de rediriger directement le canal de sortie → d'une commande vers → le canal d'entrée d'autre. Un tube est un moyen de transmission de données d'un processus à un autre (Fig-IV-1). Comme il est implanté par fichier, il sera désigné par des descripteurs et manipulé par les primitives read() et write().
Source : https://debian-facile.org/doc:programmation:shell:pipe Source 2 : https://www.emi.ac.ma/ntounsi/COURS/C/Pipe/pipe.html
Un pipe est aussi appelé FIFO (First In First Out) cela signifie que les données qui sortiront en premier de envoyeur seront également les données qui rentreront en premier dans receveur.
Cependant, l'ordre est celui dans lequel les appels-système à WRITE et READ ont été invoqués, pas l'ordre dans lequel les processus tentent de les réaliser.
Par défaut, les pipe sont bloquants, ce qui signifie que lorsque envoyeur écrit dans le pipe, il s'endort jusqu'à ce que le processus receveur ait terminé de TOUT lire, ce qui réveille envoyeur. Si receveur est prêt à lire dans le pipe mais qu'envoyeur n'y a encore rien écrit, receveur s'endort et se réveillera dès qu'il y aura quelque chose à lire.
Un pipe possède deux extremités. Il n'est possible de faire passer des informations que dans un sens unique. On peut donc écrire des informations à l'entré et en lire à la sortie. Les deux extrémités sont référencés par des descripteurs de fichiers (des entiers stoqués dans la variable fd).
fd[1] > pipe > fd[0]
La différence avec l'exemple précedent est que, en plus de créer un pipe, notre processus cré un fils. Le pipe est alors automatiquement partagé entre le père et le fils. Si l'un écrit dans le pipe alors on ne sait pas lequel des deux va recevoir l'information. Ceci peut donner des résultats inattendus.
fd[1] (processus père) > pipe > fd[0] (processus fils)
Source : http://www.zeitoun.net/articles/communication-par-tuyau/start
Manipulation des tubes
- La création
- La lecture
- L'écriture
- La fermeture
Source : https://www.tala-informatique.fr/wiki/index.php/C_pipe
Le type pid_t
pid_t data type stands for process identification and it is used to represent process ids. Whenever, we want to declare a variable that is going to be deal with the process ids we can use pid_t data type.
The type of pid_t data is a signed integer type (signed int or we can say int).
Source : https://www.includehelp.com/c/process-identification-pid_t-data-type.aspx
L'appel système #include <unistd.h> int pipe (ind fd[2]) ; crée une structure de communication appelée tube (pipe en anglais).
Il retourne deux descripteurs de fichiers, fd[0] et fd[1].
fd[0] est ouvert en lecture sur le tube et fd[1] est ouvert en écriture sur le tube.
Les valeurs écrites sur fd[1] par la primitive write() pourront être lues sur fd[0] avec la primitive read().
Une opération de lecture (read()) sur un pipe vide est bloquante si un descripteur est encore ouvert sur le tube en écriture ; retourne 0 si tous les descripteurs en écriture sur le tube ont été fermés. pipe() retourne normalement 0 ; -1 en cas d'erreur.
Source : https://www.cristal.univ-lille.fr/~marquet/ens/sem/tubes/tubes001.html
Source : https://www.i3s.unice.fr/~tettaman/Classes/L2I/ProgSys/5_ProgSysLinuxTube.pdf
Les processus