Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 664c05250964d29fcf1d0bb310959fbc > files > 48

mandrake-doc-fr-10.0-5.1.100mdk.noarch.rpm

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Tubes "anonymes" et tubes nommés</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Manuel de référence"><link rel="up" href="ext2fs.html" title="Chapitre 9. Le système de fichiers Linux"><link rel="previous" href="ext2fs-ln.html" title="Les liens"><link rel="next" href="ext2fs-special.html" title="Les fichiers spéciaux : fichiers mode bloc et caractère"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Tubes "anonymes" et tubes nommés</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="ext2fs-ln.html">Précédent</a> </td><th width="60%" align="center">Chapitre 9. Le système de fichiers Linux</th><td width="20%" align="right"> <a accesskey="n" href="ext2fs-special.html">Suivant</a></td></tr></table><hr></div><div class="sect1" lang="fr"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="ext2fs-pipe"></a>Tubes "anonymes" et tubes nommés</h2></div></div><div></div></div><p><a name="BId-ext2fs-pa42"></a>
Revenons à l'exemple des tubes, car il est très intéressant et il
constitue en soi une bonne illustration de la notion de liens. Lors de
l'utilisation d'un tube dans une ligne de commande, voici ce qui se
produit : le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> crée le tube et va faire en sorte que
la commande située avant le tube écrive dans celui-ci, et que la
commande située après lise les données du tube. Tous les tubes, qu'ils
soient anonymes <a class="indexterm" name="BId-ext2fs-it18"></a>(comme ceux utilisés par le <span class="foreignphrase"><i class="foreignphrase">shell</i></span>) ou nommés
<a class="indexterm" name="BId-ext2fs-it19"></a> (voir ci-dessous),
fonctionnent selon le principe <span class="acronym">FIFO</span> (<span class="foreignphrase"><i class="foreignphrase">First In, First
Out</i></span>, <span class="foreignphrase"><i class="foreignphrase">premier arrivé, premier
servi</i></span>). L'utilisation des tubes avec le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> a
déjà été illustrée, mais il est intéressant de le faire à
nouveau :
</p><a name="BId-ext2fs-pl4"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="programlisting">$ ls -d /proc/[0-9] | head -5
/proc/1/
/proc/2/
/proc/3/
/proc/4/
/proc/5/</pre></td></tr></table><p><a name="BId-ext2fs-pa43"></a>
Ce qui ne peut se voir dans cet exemple (parce que cela se passe trop
vite) est la chose suivante : les écritures sur le tube sont
bloquantes. Cela veut dire que quand la commande <span><b class="command">ls</b></span> écrit
dans le tube, elle est bloquée jusqu'à ce qu'un processus à l'autre
bout lise à partir du tube. Pour visualiser cet effet, on pourra créer
des tubes nommés (et qui, donc, seront liés, par opposition aux tubes
utilisés par le <span class="foreignphrase"><i class="foreignphrase">shell</i></span> qui ne le sont
pas)<sup>[<a name="id2555706" href="#ftn.id2555706">25</a>]</sup>. La commande pour créer de tels tubes est
<span><b class="command">mkfifo</b></span> :



      <a name="BId-ext2fs-pl5"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="programlisting">$ mkfifo un_tube
$ ls -il
total 0
    169 prw-rw-r--    1 reine    reine           0 déc 10 14:12 un_tube|
  #
  # On constate que le compteur de liens indique 1, et la sortie
  # que le fichier est un tube ('p').
  #
  # On pourra aussi utiliser ln ici :
  #
$ ln un_tube le_même_tube
$ ls -il
total 0
    169 prw-rw-r--    2 reine    reine           0 déc 10 15:37 un_tube|
    169 prw-rw-r--    2 reine    reine           0 déc 10 15:37 le_même_tube|
$ ls -d /proc/[0-9] &gt;un_tube
  #
  # Le processus est bloqué puisqu'il n'y a pas de lecteurs à l'autre
  # bout. Tapez C-z pour suspendre le processus...
  #
zsh: 3452 suspended  ls -d /proc/[0-9] &gt; un_tube
  #
  # ...Puis placez-le en arrière-plan :
  #
$ bg
[1]  + continued  ls -d /proc/[0-9] &gt; un_tube
  #
  # Maintenant lisez depuis le tube...
  #
$ head -5 &lt;le_même_tube
  #
  # ...le processus écrivain se termine :
  #
[1]  + 3452 done       ls -d /proc/[0-9] &gt; un_tube
/proc/1/
/proc/2/
/proc/3/
/proc/4/
/proc/5/
$</pre></td></tr></table><p>


De même, les lectures sont bloquantes. Si les commandes ci-dessus sont
exécutées dans l'ordre inverse, nous observons que
<span><b class="command">head</b></span> se bloque en attendant qu'un processus lui
envoie quelque chose à lire :



      <a name="BId-ext2fs-pl6"></a></p><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="programlisting">$ head -5 &lt;un_tube
  #
  # Le processus est bloqué, suspendez-le : C-z
  #
zsh: 741 suspended  head -5 &lt; un_tube
  #
  # Mettez-le en tâche de fond...
  #
$ bg
[1]  + continued  head -5 &lt; un_tube
  #
  # ...Et donnez-lui à manger :)
  #
$ ls -d /proc/[0-9] &gt;le_même_tube
$ /proc/1/
/proc/2/
/proc/3/
/proc/4/
/proc/5/
[1]  + 741 done       head -6 &lt; un_tube
$</pre></td></tr></table><p>


      On constatera également un effet indésirable dans cet
exemple : la commande <span><b class="command">ls</b></span> a fini son exécution
avant que la commande <span><b class="command">head</b></span> ne prenne le relais. La
conséquence est que vous êtes renvoyé immédiatement au prompt, et
<span><b class="command">head</b></span> n'est exécutée qu'après. Elle effectue en fait
sa sortie seulement une fois le prompt récupéré.</p><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2555706" href="#id2555706">25</a>] </sup>D'autres différences existent entre les deux types
de tubes, mais cela sort du cadre de ce
chapitre.</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="ext2fs-ln.html">Précédent</a> </td><td width="20%" align="center"><a accesskey="u" href="ext2fs.html">Niveau supérieur</a></td><td width="40%" align="right"> <a accesskey="n" href="ext2fs-special.html">Suivant</a></td></tr><tr><td width="40%" align="left" valign="top">Les liens </td><td width="20%" align="center"><a accesskey="h" href="index.html">Sommaire</a></td><td width="40%" align="right" valign="top"> Les fichiers spéciaux : fichiers mode bloc et caractère</td></tr></table></div></body></html>