But de la séance 2
EXERCICE (en préambule)
|
1.1 Notion de processus
Un processus est un programme qui est en cours d'exécution. A un instant donné, plusieurs processus peuvent s'exécuter sur un même ordinateur. Chaque processus est identifié par un numéro unique dans le système (pid, pour process id) et c'est au travers de cette identification qu'un utilisateur pourra agir sur le processus (l'arrêter, le redémarrer, etc).
1.2 Identification d'un processus
La commande ps permet de connaître les identifications des processus actifs (c.a.d en cours d'exécution) à l'instant courant. Il existe un grand nombre d'options associées à cette commande. Par exemple,
Quand vous lancez un programme, vous perdez la main jusqu'à la fin de l'exécution du programme. Vous pouvez vous dégager d'une exécution en demandant que celle-ci soit transformée en tâche de fond. Pour cela, il faut faire suivre l'appel du programme par le symbole &.
Si vous avez déjà lancé un programme sans cette option et que vous souhaitez le faire passer en tâche de fond, vous devez interrompre votre programme avec Ctrl-z, puis taper bg (pour background). Par la suite, la commande fg (pour foreground) permettra de faire revenir votre programme en tâche normale, si vous le souhaitez, en tapant fg numéro-de-job, le numéro de job étant récupérable au travers de la commande jobs.
EXERCICE
b. Arretez ce programme pour le faire passer en tâche de fond c. Faites revenir ce programme en tâche normale |
1.4 Ctrl-c et kill
Pour tuer un processus en cours d'exécution, il existe deux moyens. Le premier consiste à utiliser la commande kill suivie de l'option -9 puis de l'identification du processus à tuer. L'autre moyen, si ce programme n'est pas une tâche de fond, consiste à taper Ctrl-c dans la fenêtre dans laquelle il a été lancé.
EXERCICE
b. Tuez le processus exécutant ce programme par Ctrl-c. c. Relancez une exécution du programme en tâche de fond (en tapant nedit &) d. Tuez le nouveau processus par la commande kill. |
2. Manipulation des commandes données au shell
2.1 Historique
Le shell (ou
interpréteur de commande) conserve un historique des commandes
que vous lui avez données à exécuter.
Pour remonter dans la liste des
commandes précédentes, vous pouvez utiliser Ctrl-P ou la
flèche montante de votre clavier (Ctrl-N ou flèche
descendante pour redescendre).
Pour visualiser l'historique,
tapez history.
Pour ré-exécuter une commande
donnée, tapez !<numéro de commande>.
2.2 Aliasing
Certaines commandes peuvent être longues à taper ; Il existe un moyen simple de " raccourcir " les commandes. Le mécanisme d'alias permet en effet de dire à l’interprète de commandes : considère que tel mot signifie telle commande. Par exemple :
alias ll='ls -l'
ll sera automatiquement associé à ls -l
unalias ll
supprime
l'alias
EXERCICE
|
3. Variables
d'environnement
Lors de la connexion d'un utilisateur dans
le système, ce dernier
possède un environnement de travail. Comme vous avez pu le remarquer dans les sessions
précédentes, cet
environnement vous place automatiquement dans votre répertoire
principal lors de la connexion. Il y a en fait beaucoup d'autres
actions qui sont effectuées de manière implicite lors de cette
connexion. Ces actions sont "programmées" dans différents
fichiers de configuration, dont l'un s'appelle .cshrc (il s'agit en fait
du fichier de configuration du shell csh). Le fichier .cshrc est "exécuté' à chaque lancement du
shell (donc à chaque fois qu'un xterm est lancé).
Les actions effectuées dans un fichier de configuration consistent entres autres en :
EXERCICE
a. Exécutez la commande env et essayez de deviner le rôle de certaines variables d'environnement (d’après leur nom et leur valeur) b. Lorsque vous vous connectez, le système vérifie s'il existe un fichier .cshrc personnel dans votre répertoire principal et l’exécute dans l'affirmative. Cela permet de personnaliser le fonctionnement du shell. Avec nedit, créez dans votre répertoire principal un fichier de nom .cshrc (le point n'est pas une erreur de frappe !). Ecrivez dans ce fichier la ligne suivante : alias pere "cd .." c. "ré-exécutez" votre fichier .cshrc en tapant la commande source .cshrc d. Vérifiez que l'alias défini fonctionne bien ... |
On rappelle que la plupart des
commandes Unix utilisées (ls,
cd, cp, etc.) sont des
programmes stockés sur le disque dur de la machine. La variable
path est une variable d'environnement importante.
Elle contient la liste des répertoires dans lesquels
l’interprète de commande va aller chercher (dans cet ordre !)
les programmes correspondant aux commandes que vous lui
fournissez. La commande which permet de rechercher
l'emplacement d'un programme. Lorsque vous tapez which
nom_prog, le shell recherche un fichier exécutable de nom
nom_prog. Il effectue sa recherche en parcourant
les répertoires définis dans la variable path (comme le ferait
l’interprète de commande pour exécuter mon_prog).
EXERCICE
b. Créez un répertoire ESSAI et copiez ce programme date dans ce répertoire sous le nom ls c. Placez-vous dans le répertoire ESSAI d. Examinez le contenu de votre variable path (echo $path). Quel programme sera exécuté si vous tapez ls ? e. Vérifiez-le en tapant ls f. Tapez maintenant ./ls et interprétez ce qu'il se passe. |
EXERCICE
b. modifiez la commande path en ajoutant le répertoire ESSAI en tête de liste : set path=(~/PL1/Essai $path) c. vérifiez en tapant echo $path que la modification a bien eu lieu d. tapez ls e. placez-vous-vous dans votre répertoire principal et tapez ls f. détruisez le répertoire ESSAI et son contenu, et fermez ce xterm. |
5. Premiers pas avec le langage C
L'objectif est ici d'examiner
un premier programme C, de le compiler et de l’exécuter, puis de
le modifier.
On considère pour cela le programme C suivant, qui est dans
votre répertoire Rentree2/max.c
#include <stdio.h>
int main() {
int x, y ;
printf ("tapez deux entiers au clavier\n") ;
scanf("%d", &x) ;
scanf("%d", &y) ;
if (x > y) {
printf("le maximum des
deux entiers est %d\n", x) ;
} else {
printf("le maximum des deux entiers
est %d\n", y) ;
} ;
return 0 ;
}
Ce fichier est un programme
source. Il contient des instructions en C, facile à comprendre
par une personne qui connaît ce langage, mais pas
exécutable tel quel par l'ordinateur. Pour produire un programme
exécutable il faut donc d'abord traduire ce programme source en
un fichier contenant des instructions exécutables par le
processeur de la machine. On utilise pour cela un compilateur.
EXERCICE
|
EXERCICE
|
Dans la commande de compilation, l'option -Wall permet d'être informé sur l'ensemble des erreurs et avertissements (ou warnings) relevés par le compilateur sur la correction du programme source. Tant qu'il subsiste des erreurs, le programme exécutable n'est pas produit. Si tous les warning ne sont pas éliminés le programme exécutable est tout de même produit ; mais pour éviter des mauvaises surprises, nous vous conseillons néanmoins de les corriger systématiquement (ils indiquent en général des problèmes potentiels à l'exécution). Si vous ne mentionnez pas l'option -Wall les warnings ne sont pas signalés.
6. Redirection des entrées-sorties d'un programme dans un fichier
Lorsqu'un programme s'exécute,
tous ses affichages se font par défaut sur l'écran. Il existe un
mécanisme qui permet de rediriger les affichages dans un
fichier. Pour cela , il faut faire suivre l'appel du programme
par le symbole > suivi du nom de fichier voulu (nom_prog
> nom_fichier). Cette possibilité est intéressante
lorsque le nombre d'affichage est important, et que l'on
souhaite pouvoir vérifier la bonne exécution du programme en
étudiant ses traces d'exécution.
Deux variantes utiles :
nom_prog > nom_fichier crée (ou remplace) le fichier nom_fichier avec la sortie de nom_prog
nom_prog >> nom_fichier ajoute la sortie de nom_prog à la fin du fichier nom_fichier
Il est également possible de rediriger les entrées d'un programme, pour que celui-ci lise les données non pas au clavier mais depuis un fichier donné. Pour cela, il faut faire suivre l'appel du programme par le symbole < suivi du nom de fichier d'entrée.
EXERCICE
b. Recommencez en ajoutant la nouvelle sortie de la commande ls au même fichier ls_res. c. Que fait la commande suivante : cat ls_res > f d. Exécuter le programme max en redirigeant ses entrées depuis un fichier. Que faut-il écrire dans ce fichier pour que le programme fonctionne ? |
7. Redirection de la sortie d'un programme vers l'entrée d'un autre
Il est possible de rediriger les sorties d'un programme de telle sorte que les données produites en sortie soient fournies en entrée à un deuxième programme, activé à la suite du premier programme.
EXERCICE Que fait la commande
suivante : ls -l | wc
-l (utilisez man
pour comprendre ce que fait wc).
|
8. Séquencement
L'opérateur de séquencement est le point virgule. Il permet d'exécuter plusieurs commandes en séquence.
Cde1 ; Cde2
; Cde3 engendre l'exécution de Cde1, puis de Cde2, puis de
Cde3.
EXERCICE Construire la commande composée de trois sous-commandes séquentielles, qui effectue l'équivalent de la commande donnée à l'exercice précédent en passant par un fichier intermédiaire :
|
EXERCICE
|