Rewrite lecture 2.
authorKim Nguyễn <kn@lri.fr>
Tue, 16 Sep 2014 10:28:20 +0000 (12:28 +0200)
committerKim Nguyễn <kn@lri.fr>
Tue, 16 Sep 2014 10:28:20 +0000 (12:28 +0200)
unix_prog_web/unix_prog_web_02.xhtml

index ffc87a0..8298226 100644 (file)
     </style>
   </head>
   <body>
-    <a href="unix_prog_web_02.xhtml" class="sws-previous" />
+    <a href="unix_prog_web_01.xhtml" class="sws-previous" />
     <div class="sws-slide sws-cover sws-option-nofooter">
       <h1>Unix et Programmation Web</h1>
       <h1>Cours 2</h1>
       <a href="mailto:kn@lri.fr">kn@lri.fr</a><br/>
       <a href="http://www.lri.fr/~kn/">http://www.lri.fr/~kn</a>
     </div>
-
-    <div class="sws-slide" >
-      <h1> Plan </h1>
-      <ol >
-        <li> Systèmes d'exploitation
-          <ul class="empty">
-            <li>1.1 Principes des systèmes
-              d'exploitation &#10004;</li>
-            <li>1.2 Système de gestion de fichiers &#10004;</li>
-            <li  class="hl">1.3 Système de gestion de processus</li>
-          </ul>
-        </li>
-      </ol>
-    </div>
+<h1> Gestion des processus</h1>
 
     <div class="sws-slide">
       <h1> Définitions </h1>
@@ -93,7 +80,7 @@
 
     <div class="sws-slide">
       <h1> Exemple: programme </h1>
-      <p>Dans un fichier « <code> counter.c </code> »
+      <p>Dans un fichier « <tt> counter.c </tt> »
         (<span style="color:red;">attention c'est du pseudo
           C</span>)</p>
       <div style="float:left;clear:both;vertical-align:top;width:45%;display:inline-block;border-right: 1pt solid #494948;">
         <code>
           gcc -o counter.exe counter.c
         </code><br/>
-        Le <em>fichier</em> « <code>counter.exe</code> » est un
+        Le <em>fichier</em> « <tt>counter.exe</tt> » est un
         exécutable (fichier binaire contenant du code machine)<br/>
         <code>
           ./counter.exe <span style="margin-left:2em;font-size:smaller;color:red;"> ← il faut la permission +x sur le fichier</span>
             réveil du <i>thread</i> <code style="color:red;">listen</code></span>
         </li>
         <li class="sws-pause" ><span style="color:white;background:red">listen</span>
-          (<span style="color:red;">incrémente <code style="color:red">count</code></span>)<br/>
+          (<span style="color:red;">incrémente <tt style="color:red">count</tt></span>)<br/>
           <span style="color:red;">attente de connexion →</span><br/>
           <span>… fin des 3s</span><br/>
           <span style="color:green;">←
-            réveil du <i>thread</i> <code style="color:green;">display</code></span>
+            réveil du <i>thread</i> <tt style="color:green;">display</tt></span>
         </li>
         <li class="sws-pause" ><span style="color:white;background:green">display</span> (<span style="color:green;">affiche
             1 à l'écran)</span> </li>
           pendant 50㎲ </li>
         <li > Exécution du processus qui dessine le bureau pendant 50
           ㎲<br/> … </li>
-        
+
       </ol>
       <p>C'est le <em>gestionnaire de processus</em> qui décide quel
         programme a la main et pour combien de temps (priorité aux
     <div class="sws-slide">
       <h1>La commande <code><em>ps</em></code></h1>
       <p>Permet d'avoir des informations sur les processus en cours
-        d'exécution (voir « <code>man ps</code> » pour les
+        d'exécution (voir « <tt>man ps</tt> » pour les
         options):<br/>
         <code>$ ps -o user,pid,state,cmd x
           USER     PID   S CMD
           kim      29869 R ps -o user,pid,state,cmd x
         </code><br/>
       </p>
-      
+
     </div>
     <div class="sws-slide">
       <h1>États des processus (sous Linux)</h1>
@@ -576,7 +563,7 @@ libre)</span><br/>
           directement en arrière plan en faisant:<br/>
 <code> $ gedit &amp; </code><br/></span>
         <span class="sws-pause">On peut envoyer un signal à un
-          processus avec la commande «&nbsp;<code>kill [-signal] pid</code>&nbsp;»<br/>
+          processus avec la commande «&nbsp;<tt>kill [-signal] pid</tt>&nbsp;»<br/>
 <code> $ kill -9 2345  </code></span>
         </p>
         </div>
@@ -585,18 +572,18 @@ libre)</span><br/>
       <p>Le terminal et le processus sont liés par trois fichiers
       spéciaux:</p>
       <ol>
-        <li> L'entrée standard (<code><em>stdin</em></code>), reliée
+        <li> L'entrée standard (<tt><em>stdin</em></tt>), reliée
           au clavier</li>
-        <li> La sortie standard (<code><em>stdout</em></code>), reliée
+        <li> La sortie standard (<tt><em>stdout</em></tt>), reliée
           à l'affichage</li>
-        <li> La sortie d'erreur (<code><em>stderr</em></code>), reliée
+        <li> La sortie d'erreur (<tt><em>stderr</em></tt>), reliée
           à l'affichage</li>
       </ol>
       <p>Dans le <i>shell</i>, on peut utiliser les
-      opérateurs <code><em>&lt;</em></code>, <code><em>&gt;</em></code>
-      et <code><em>2&gt;</em></code> pour récupérer le contenu
-      de <code><em>stdin</em></code>, <code><em>stdout</em></code>
-      et <code><em>stderr</em></code>:<br/>
+      opérateurs <tt><em>&lt;</em></tt>, <tt><em>&gt;</em></tt>
+      et <tt><em>2&gt;</em></tt> pour récupérer le contenu
+      de <tt><em>stdin</em></tt>, <tt><em>stdout</em></tt>
+      et <tt><em>stderr</em></tt>:<br/>
 <code>
 $ sort &lt; toto.txt
 $ ls -l  &gt; liste_fichiers.txt
@@ -632,6 +619,176 @@ $ ls -l * 2&gt; erreurs.txt
       </div>
 
     </div>
+
+<h1>Écriture de script <i>shell</i></h1>
+<div class="sws-slide">
+  <h1>Script shell</h1>
+  <p><a>Mentalité Unix</a> beaucoup de petits programmes spécifiques,
+  que l'on combine au moyen de scripts pour réaliser des actions
+  complexes. Exemple de fichier script:
+  </p>
+  <code style="background:white;">
+    <s>#!/bin/bash</s>
+
+    <s>for</s> i <s>in</s>  img_*.jpg
+    <s>do</s>
+      base=$(echo "$i" | cut -f 2- -d '_')
+      nouveau=photo_"$base"
+      <s>if</s> test -f "$nouveau"
+      <s>then</s>
+         echo "Attention, le fichier $nouveau existe déjà"
+         continue
+      <s>else</s>
+         echo "Renommage de $i en $nouveau"
+         mv "$i" "$nouveau"
+      <s>fi</s>
+    <s>done</s>
+  </code>
+</div>
+<div class="sws-slide">
+<h1>Rendre un script exécutable</h1>
+<p>Si un fichier <a>texte</a> (quel que soit son extension), commence
+  par les caractères <tt>#!/chemin/vers/un/programme</tt>, on peut
+  rendre ce fichier exécutable (<tt>chmod +x</tt>). Si on l'exécute,
+  le contenu du fichier est passé comme argument à <tt>programme</tt>
+  (qui est généralement un interpréteur)
+</p>
+<p><tt>#!/bin/bash</tt> signifie que le corps du fichier est passé au
+  programme <tt>bash</tt> qui est l'interprète de commande
+  (le <i>shell</i>).
+</p>
+</div>
+<div class="sws-slide">
+<h1>Que mettre dans un script</h1>
+<ul>
+  <li> des commandes (comme si on les entrait dans le terminal)</li>
+  <li> des structures de contrôle (boucles <tt>for</tt>, <tt>if then
+  else</tt>) </li>
+  <li> des définitions de variables </li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Définitions de variables</h1>
+<p>On peut définir des variables au moyen de la notation
+<code>VARIABLE=<i>contenu</i></code> et on peut utiliser la variable
+avec la notation <tt>$VARIABLE</tt> </p>
+<ul>
+  <li>Attention, pas d'espace autour du <tt>=</tt></li>
+  <li>nom de variable en majuscule ou minuscule</li>
+  <li>contenu est une chaine de caractères. Si elle contient des
+  espaces, utiliser <tt>" ... "</tt></li>
+</ul>
+<p>exemple de définition :</p>
+<code>    i=123
+    j="Ma super chaine"
+    TOTO=titi
+    echo $TOTO
+</code>
+<p> exemple d'utilisation: <tt> echo $j $i $TOTO </tt><br/>
+affiche « <tt> Ma super chaine 123 titi</tt></p>
+</div>
+<div class="sws-slide">
+<h1>Boucles <tt>for</tt></h1>
+<p>Les boucles <tt> for </tt> ont la syntaxe:
+<code>
+    for VARIABLE in elem<sub>1</sub> ... elem<sub>n</sub>
+    do
+        ....
+    done
+</code>
+chaque <tt>elem<sub>i</sub></tt> est expansé (comme une ligne de
+commande) avant l'évaluation de la boucle:
+<code>
+  for i in *.txt
+  do
+     echo $i est un fichier texte
+  done
+</code>
+On peut quitter une boucle prématurément en utilisant <tt>break</tt>
+et passer directement au tour suivant avec <tt>continue</tt>
+</p>
+</div>
+<div class="sws-slide">
+<h1>Conditionnelle</h1>
+<p>La syntaxe est :
+<code>   if <i>commande</i>
+   then
+        ...
+   else
+        ...
+   fi
+</code>
+<tt><i>commande</i></tt> est évaluée. Si elle se termine avec succès,
+la branche <tt>then</tt> est prise. Si elle se termine avec un code
+d'erreur, la branche <tt>else</tt> est prise. On peut utiliser la
+commande <tt>test</tt> qui permet de tester plusieurs conditions
+(existance d'un fichier, égalités de deux nombres, ...) et se termine
+par un succès si le teste est vrai et par un code d'erreur dans le
+cas contraire</p>
+</div>
+<div class="sws-slide">
+<h1>Conditionnelle (exemple)</h1>
+<p>On regarde tour à tour si fichier1.txt, fichier2.txt, ... existent :
+<code>
+  for i in 1 2 3 4 5 6
+  do
+    if test -f "fichier$i".txt
+   then
+      echo le fichier "fichier$i".txt existe
+   fi
+  done
+</code>
+</p>
+  </div>
+<div class="sws-slide">
+<h1>Sous-commandes et chaines</h1>
+<p>Il est pratique de pouvoir mettre <a>l'affichage d'une commande</a>
+  dans une variable. On utilise <tt>$( commande ... )</tt>:
+<code>
+  MESFICHIER=$(ls *.txt)
+  for i in $MESFICHIER
+  do
+       echo Fichier: $i
+  done
+</code>
+Attention à la présence de guillemets autour des variables. S'il y a
+f1.txt et f2.txt dans le répertoire courant:<br/>
+<code style="left:10%;position:relative;width:40%;float:left;">
+  MESFICHIER=$(ls *.txt)
+  for i in $MESFICHIER
+  do
+       echo Fichier: $i
+  done
+<s>affiche:</s>
+  Fichier: f1.txt
+  Fichier: f2.txt
+</code>
+<code style="width:40%;float:left;left:10%;position:relative">
+  MESFICHIER=$(ls *.txt)
+  for i in "$MESFICHIER"
+  do
+       echo Fichier: $i
+  done
+<s>affiche:</s>
+  Fichier: f1.txt f2.txt
+</code>
+</p>
+</div>
+<div class="sws-slide">
+<h1>Commandes utiles</h1>
+<ul>
+  <li><tt>seq <i>m</i> <i>n</i> </tt> : affiche la liste de tous les
+  nombres entre <i>m</i> <i>n</i> </li>
+<li><tt>echo ... </tt> affiche ses arguments sur la sortie
+  standard</li>
+<li><tt>printf "chaine" ... </tt> affiche ses arguments au moyen d'une
+  chaine de format (comme le printf de C)</li>
+<li><tt>date</tt> : affiche la date courante </li>
+<li><tt>cut</tt> : découpe une chaine selon des caractères de
+  séparations ou des positions</li>
+</ul>
+</div>
+<h1>Programmes non interactifs</h1>
 <div class="sws-slide">
   <h1>Processus de type <i>daemon</i></h1>
 <p>