logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
doc:programmation:shell:pipe [27/03/2014 07:47]
smolski [Introduction]
doc:programmation:shell:pipe [22/08/2018 14:41] (Version actuelle)
e-miel Ajout de la conclusion
Ligne 4: Ligne 4:
   * Niveau requis : {{tag>​avisé}}   * Niveau requis : {{tag>​avisé}}
   * Commentaires : //Utiliser le caractère pipe.« | ». //    * Commentaires : //Utiliser le caractère pipe.« | ». // 
-  * Débutant, à savoir : [[:​doc:​systeme:​commandes:​le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) 
   * Suivi : {{tag>​à-tester}}   * Suivi : {{tag>​à-tester}}
-    * Création par e-miel 20-04-2011 18:31:31+    * Création par [[user>e-miel]] le 20-04-2011 18:31:31
     * Testé par <...> le <​...> ​     * Testé par <...> le <​...> ​
   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​id=3804 | Lien vers le forum concernant ce tuto]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))   * Commentaires sur le forum : [[http://​debian-facile.org/​viewtopic.php?​id=3804 | Lien vers le forum concernant ce tuto]]((N'​hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
  
-**Nota :** 
  
-Contributeurs,​ les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! 
  
 ===== Introduction ===== ===== Introduction =====
  
-Le caractère pipe est « | ».+Le caractère pipe est « | » et s'​obtient avec la combinaison de touches : <​key>​Alt Gr</​key>​ avec le <​key>​6</​key>​ du clavier des **lettres**.
  
 Les redirections d'​entrée/​sortie(([[:​doc:​programmation:​shell:​chevrons | Les redirections en commande]])) permettent de rediriger les résultats vers un fichier. \\ Les redirections d'​entrée/​sortie(([[:​doc:​programmation:​shell:​chevrons | Les redirections en commande]])) permettent de rediriger les résultats vers un fichier. \\
Ligne 51: Ligne 48:
 Par sécurité, nous pouvons donc rédiger les commandes utilisant **pipe** sans espace dans la redirection. \\ Par sécurité, nous pouvons donc rédiger les commandes utilisant **pipe** sans espace dans la redirection. \\
 Exemple : Exemple :
-<code bash>​commande1 |commande2 |Tchibâââ</​code></​note>​+<code bash>​commande1 |commande2 |Tchibâââ</​code>​ 
 + 
 +**Remarque :** \\ 
 +//Ce qui vaut pour le pipe |, vaut également pour la redirection > amha// 
 +</​note>​ 
 + 
 ===== Fonctionnement en détail ===== ===== Fonctionnement en détail =====
  
Ligne 207: Ligne 210:
  
 <code user>wr 1s10k300k7k 2s5k 4s200k | rd 0s2k 3s5000k 5s6k</​code>​ <code user>wr 1s10k300k7k 2s5k 4s200k | rd 0s2k 3s5000k 5s6k</​code>​
 +<file config retour de la commande>​
   (1s) 1.0s    10k >   (1s) 1.0s    10k >
   (0s) 1.0s        >    2k   (0s) 1.0s        >    2k
Ligne 216: Ligne 219:
   (5s) 5.0s        >    6k   (5s) 5.0s        >    6k
        ​5.0s ​       > CLOSE        ​5.0s ​       > CLOSE
-       ​5.0s ​ CLOSE >+       ​5.0s ​ CLOSE ></​file>
  
 <​note>​Il se passe 2 secondes entre la dernière action de **wr** et la fermeture du //pipe//, **wr** a donc été tué durant son sommeil.</​note>​ <​note>​Il se passe 2 secondes entre la dernière action de **wr** et la fermeture du //pipe//, **wr** a donc été tué durant son sommeil.</​note>​
Ligne 223: Ligne 226:
  
 <code user>wr -n 1s10k300k7k 2s5k 4s200k | rd 0s2k 3s5000k 5s6k</​code>​ <code user>wr -n 1s10k300k7k 2s5k 4s200k | rd 0s2k 3s5000k 5s6k</​code>​
 +<file config retour de la commande>​
   (1s) 1.0s    10k >   (1s) 1.0s    10k >
   (1s) 1.0s    52k >   (1s) 1.0s    52k >
Ligne 233: Ligne 236:
        ​4.0s ​ CLOSE >        ​4.0s ​ CLOSE >
   (5s) 5.0s        >    6k   (5s) 5.0s        >    6k
-       ​5.0s ​       > CLOSE+       ​5.0s ​       > CLOSE</​file>​
  
 <​note>​La majorité des données a été perdue, alors que le scénario est identique au premier, au type d'​écriture près.</​note>​ <​note>​La majorité des données a été perdue, alors que le scénario est identique au premier, au type d'​écriture près.</​note>​
  
-=== WRITE > READ non-blocant ​===+=== WRITE > READ non-bloquant ​===
  
 <code user>wr 1s10k300k7k 2s5k 4s200k | rd -n 0s2k 3s5000k 5s6k</​code>​ <code user>wr 1s10k300k7k 2s5k 4s200k | rd -n 0s2k 3s5000k 5s6k</​code>​
 +<file config retour de la commande>​
   (0s) 0.0s        >    0k   (0s) 0.0s        >    0k
   (1s) 1.0s    10k >   (1s) 1.0s    10k >
Ligne 249: Ligne 252:
   (5s) 5.0s        >    6k   (5s) 5.0s        >    6k
        ​5.0s ​       > CLOSE        ​5.0s ​       > CLOSE
-       ​5.0s ​ CLOSE >+       ​5.0s ​ CLOSE ></​file>
  
 <​note>​Comme précédemment,​ on voit que **wr** a été tué durant son sommeil.</​note>​ <​note>​Comme précédemment,​ on voit que **wr** a été tué durant son sommeil.</​note>​
  
-=== WRITE non-blocant ​> READ non-bloquant ===+=== WRITE non-bloquant ​> READ non-bloquant ===
  
 <code user>wr -n 1s10k300k7k 2s5k 4s200k | rd -n 0s2k 3s5000k 5s6k</​code>​ <code user>wr -n 1s10k300k7k 2s5k 4s200k | rd -n 0s2k 3s5000k 5s6k</​code>​
 +<file config retour de la commande>​
   (0s) 0.0s        >    0k   (0s) 0.0s        >    0k
   (1s) 1.0s    10k >   (1s) 1.0s    10k >
Ligne 266: Ligne 269:
        ​4.0s ​ CLOSE >        ​4.0s ​ CLOSE >
   (5s) 5.0s        >    6k   (5s) 5.0s        >    6k
-       ​5.0s ​       > CLOSE+       ​5.0s ​       > CLOSE</​file>​
  
 <​note>​Quasiment toutes les données ont été perdues.</​note>​ <​note>​Quasiment toutes les données ont été perdues.</​note>​
 +
 +
 +===== Conclusion =====
 +
 +<note tip>
 +  * **Pipe bloquant** = comportement par défaut = aucune consommation CPU quand le processus dort = se réveille toujours au bon moment :-)
 +  * **Pipe non bloquant** = problèmes de données perdues et consommation CPU :-(
 +</​note>​
 +
 +L'​immense majorité des programmes ne personnalisent pas le comportement de leurs descripteurs,​ donc si vous utilisez des pipes dans vos scripts, ils seront bloquants :
 +
 +  * Les échanges de //petite taille// : texte brut échangé entre **awk**, **sed**, **bash**, **latex**, et en général tout traitement de script par **python** (choisi pour son efficacité à traiter les expressions régulières) se font implicitement au travers du tampon de 64ko, c'est la solution la plus rapide : chacun des processus participants enchaîne ses nombreux petits traitements internes sans s'​arrêter puis se termine indépendamment de l'​autre processus.
 +
 +  * Les échanges de //grande taille// : vidéo brute échangée entre **ffmpeg**, **x264**, et en général toute compression de grande taille par **gzip**, **xz**, se fait implicitement sans tampon, copie directe de processus à processus durant leur sommeil, c'est la solution la plus rapide : le tampon n'est jamais utilisé même partiellement.
 +
 +<​note>​La quantité de données échangées déterminera si le comportement est **tampon** ou **sommeil**,​ mais dans les deux cas, les pipes sont bloquants.</​note>​
 +
doc/programmation/shell/pipe.1395902870.txt.gz · Dernière modification: 27/03/2014 07:47 par smolski

Pied de page des forums

Propulsé par FluxBB