Stage rentrée L&P - Partie II (Séances 3 et 4)
DESS CCI  1999-2000
 

 

Buts des séances 3 et 4

 
1- Manipulation de processus Unix

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,

ps -u nom-d'utilisateur         liste les processus s'exécutant pour un utilisateur donné
ps -ef                                             affiche la liste de tous les processus actifs du système.

 

1.3 Taches de fond

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 tache de fond. Pour cela, il faut faire suivre l'appel du programme par le symbole & (option background).

Si vous avez déjà lancé un programme sans cette option et que vous souhaitez le faire passer en tache de fond, vous devez interrompre votre programme avec Ctrl-z, puis taper bg. Par la suite, la commande fg (pour foreground) permettra de faire revenir votre programme en tache 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  
    a. Lancez le programme axe, dont la fonction principale exécute une boucle infinie de traitement d'événements graphiques.  
    b. Arretez ce programme pour le faire passer en tache de fond  
    c. Faites revenir ce programme en tache 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 vous processus n'est pas une tâche de fond, consiste à taper Ctrl-c dans la fenêtre dans laquelle il a été lancé.

 
EXERCICE  
    a. Relancez le programme axe 
    b. Tuez le processus exécutant ce programme par Ctrl-c.   
    c. Relancez une exécution du programme en tache de fond.  
    d. Tuez le nouveau processus par la commande kill.
 
 

1.5 Redirection des 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.
En utilisant >> au lieu de >, alors la sortie d'un programme est ajoutée à la fin du fichier donné.

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  
    a. Redirigez les sorties de la commande ls dans un fichier ls_res.  
    b. Recommencez en ajoutant la sortie de la commande ls au fichier ls_res.   
    c. Que fait la commande suivante : cat ls_res > f
 

1.6 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).

 
1.7 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 :  

  1. le résultat de ls -l est placé dans un fichier f
  2. on comptabilise le nombre de lignes de f
  3. on détruit f
 

2. Manipulation des commandes données au shell

2.1 Historique
Le shell 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 doné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'aliasing 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 l                    supprime l'alias
 
 
EXERCICE  
    Testez l'usage de l'historique et des alias.
 

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 de travail (home-directory). Il y a en fait beaucoup d'autres actions qui sont effectuées de manière implicite lors de votre connexion. Ces actions sont "programmées" dans différents fichiers de configuration, dont l'un s'appelle .cshrc. 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 consiste entres autres en :

Le Shell est non seulement un langage de commande, mais également un langage de programmation. Pour cette raison, il introduit les notions de variables, de paramètre, de structures de controle (si, sinon, tant que, etc). Une variable Shell est appelée variables d'environnement. Elle est identifiée par un nom. L'affectation d'une valeur à une variable d'environnement permet de configurer son propre environnement de travail. Par exemple : La valeur d'une variable d'environnement peut être consultée par la commande echo $nom_variable. Les valeurs de l'ensemble des variables d'environnement sont données par la commande env.
 
EXERCICE  
    a.  Consultez la valeur de la variable PATH  
    b. Testez la commande env  
    c. Consultez le contenu de votre fichier .cshrc (toute ligne commencant par # est un commentaire)  
    d. Ajoutez un alias et "ré-exécutez" votre fichier .cshrc en tapant la commande source .cshrc  
    e. Vérifiez que l'alias défini fonctionne bien
 

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 dans l'ordre dans lequel ils sont donnés les répertoires définis dans la variable PATH.
 
EXERCICE   
    a. Rechercher l'emplacement du programme date, qui donne la date courante.  
    b. Copiez ce programme dans votre répertoire PROGRAMS, sous le meme nom  
    c. Lancez la commande date ; Quel est le programme exécuté ? celui se trouvant dans PROGRAMS ou l'autre? 

    d. Renommez maintenant votre programme PROGRAMS/date en PROGRAMS/date2  
    e. Lorsque vous lancez date, quel est le programme exécuté ? 
    f. Modifiez la variable d'environnement PATH pour faire en sorte de pouvoir exécuter la commande date2, en étant placé dans n'importe quel répertoire  
    f. Détruisez le fichier PROGRAMS/date2.

 

 4.  Cycle de vie simplifié d'un programme C

Module

Tout fichier contenant une ou plusieurs fonctions C et/ou une ou plusieurs déclarations de types de données ou de variable est appelé module. Une programme C est constitué d'un ou plusieurs modules, dont l'un contient la définition de la fonction principale du programme appelée main. La modularité est un mécanisme qui permet de concevoir et de mettre au point des programmes par fragments.

Dans le cadre du stage de rentrée, nous allons manipuler des programmes de très petite taille. De ce fait, chaque programme sera défini dans un seul module. Par la suite, les programmes que vous aurez à réaliser devenant de taille de plus en plus importante, vous utiliserez la notion de module afin de structurer la définition de vos programmes.

 
Compilateur

Le compilateur est l'outil qui traduit du un programme source en code objet, c'est à dire en code compréhensible par la machine. Le code source traduit par le compilateur ne correspond pas forcément à un programme complet ; ce peut être un ou plusieurs fragments (compilation de modules contenant seulement une partie du programme).  La compilation comprend en effet deux étapes principales :

Pour exécuter une compilation C, il faut taper la commande gcc suivie des paramètres listés ci-après dont tous sont optionnels sauf le quatrième. Concernant les deux derniers paramètres, nous allons donner une vision très simpliste de ce que sont les fichiers include et les librairies. Une explication plus précise sera proposée plus tard.
Un fichier include est un fichier associé à un module source, qui donne accès aux fonctions définies dans ce module.  Par exemple, pour qu'un module M1.c puisse utiliser les fonctions définies dans un autre module  (soit M2.c), alors il faut placer dans le fichier M1.c la directive d'inclusion suivante : #include M2.h, ou M2.h est le fichier include associé au module M2.c.
Les librairies sont également des morceaux de programmes utilisables dans d'autres programmes. A la différence des fichiers include, les librairies sont déja compilées. On trouve en général sur toutes les machines Unix des librairies standart, donnant par exemple accès à des fonctions mathématiques, ou à des fonctions graphiques.

Dans le cadre du stage de rentrée, nous n'utiliserons pas de fichiers include ni de librairies.
 
 
  • EXERCICE  
    1. Creez un répertoire MAX_3 dans votre répertoire PROGRAMS
    2. Si cela n'a pas encore été fait, récupérez le fichier max_3.c qui calcule le maximum de 3 entiers, à l'URL :  http://sirac.inrialpes.fr/~boyer/CCI/cours  (cliquez sur RENTREE2.tar.gz, qui donne acces aux fichiers requis compressés et archivés).
    3. Regardez le contenu du fichier max_3.c.
    4. Tapez la commande suivante : gcc -o max_3 max_3.c 
    5. Exécuter le programme max_3, en tapant le nom du fichier exécutable généré par le compilateur.
     

     
    2-Mise en place de votre environnement de programmation

    Il est important de mettre en place un environnement de développement de programme C simple et modulaire. Nous vous proposons de créer l'arborescence donnée ci-après à partir de votre répertoire racine. Le répertoire PROGRAMS servira à stocker les programmes C que vous réaliserez. Ce répertoire contiendra un sous-répertoire par programme. Vous pouvez également créer un répertoire de nom UTIL, qui servira à stocker les modules contenant des fonctions d'utilité générale, comme par exemple les fonctions d'entrée/sorties que nous étudierons plus tard.
    Chaque répertoire correspondant à un programme contiendra trois sous-répertoires :

    Chaque module composant un programme C devra en outre suivre des normes de programmation (voir l'URL :  http://sirac.inrialpes.fr/~boyer/cours/CCI ), qui assurent un certain niveau de qualité quant à la lisibilité et à la maintenance du module.
    Pour faciliter l'utilisation de ces normes, il est également conseillé de créer un répertoire Modele, qui contiendra des modèles de fichiers .c et .h, que vous n'aurez plus qu'à compléter (en respectant les normes bien sur) lorsque vous construirez un nouveau programme.  L'URL http://sirac.inrialpes.fr/~boyer/cours/CCI  donne également accès aux modèles.
     
     
    Arborescence conseillée :  
                                                                                      C  
                                                 /                           /                       \                              \  
                                           MAX_3                .....                 UTIL                      MODELE  
                                   /           |          \                                   /           |         \                /              \  
                                SRC     INC    OBJ                       SRC    INC   OBJ      modele.c    modele.h  

    EXERCICE  

    1. Créez votre arborescence de développement
    2. Rapatriez dans votre répertoire MODELE les fichiers modele.c et modele.h.