Buts des séances 3 et 4
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 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
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
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
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). |
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 :
|
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
|
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 :
EXERCICE
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
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
|
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 :
Dans le cadre du stage de rentrée,
nous n'utiliserons pas de fichiers include ni de librairies.
|
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 :
Arborescence conseillée
:
C / / \ \ MAX_3 ..... UTIL MODELE / | \ / | \ / \ SRC INC OBJ SRC INC OBJ modele.c modele.h EXERCICE
|