</style>
</head>
<body>
- <a href="prog_internet_01.xhtml" class="sws-previous" />
+ <a href="unix_prog_web_01.xhtml" class="sws-previous" />
<div class="sws-slide sws-cover sws-option-nofooter">
- <h1>Programmation Internet</h1>
+ <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 ✔</li>
- <li>1.2 Système de gestion de fichiers ✔</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>
<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>
directement en arrière plan en faisant:<br/>
<code> $ gedit & </code><br/></span>
<span class="sws-pause">On peut envoyer un signal à un
- processus avec la commande « <code>kill [-signal] pid</code> »<br/>
+ processus avec la commande « <tt>kill [-signal] pid</tt> »<br/>
<code> $ kill -9 2345 </code></span>
</p>
</div>
<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><</em></code>, <code><em>></em></code>
- et <code><em>2></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><</em></tt>, <tt><em>></em></tt>
+ et <tt><em>2></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 < toto.txt
$ ls -l > liste_fichiers.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>