TP session 2 - Laurent Bobelin

publicité
e2i5
module Unix : programmation sytème en C sous Linux
TP2 : Processus
L’objectif de cette fiche est de se familiariser et de comprendre le comportement des processus à l’aide
(principalement) de la commande fork().
1
Foreground, background, kill
– Utilisez le manuel pour vous documenter, et ensuite utiliser les commandes : ps, top, time, kill, pmap.
– Lancer la commande emacs (ou gedit). En utilisant les commandes appropriées, stopper emacs (attention,
stopper n’est pas tuer), puis relancer–le en tâche de fond.
– Tuer emacs avec la commande kill.
– Que se passe–t–il si vous tuez le processus associé à bash ?
2
Utilisation de fork
– Écrire un programme dont le père va créer 4 fils. Chaque fils devra afficher un message du type "(fils numero
i de pid x) bonjour” au départ de son exécution et un message du type "(fils numero i de pid x) au revoir” à
la fin de son exécution.
– Modifier ce programme pour que le père affiche un message avant la création de chaque fils et signale la fin
de l’exécution de chaque fils.
3
Exec
– En utilisant la fonction exec, exécuter la commande "ls -al”.
– Modifier ce programme pour permettre à l’utilisateur de taper un paramètre à passer à la commande.
– Même question, mais avec un nombre de paramètres non connu à la compilation (il faudra alors utiliser
execv).
4
Arrêt d’un processus
– Créer dans votre répertoire de connexion un nouveau répertoire nommé exo2. Ecrire dans un fichier compteur.c un programme suivant l’algorithme :
– i=0
– Répéter infiniment :
– i <- i + 1
– si i est multiple de 100 000, afficher i et un saut de ligne (
n).
– Lancer l’exécution de ce programme et vérifier qu’il fonctionne. L’arrêter en tapant CTRL-C.
– En utilisant les fonctionnalités du shell (&, fg, bg), lancer quatre instances du programme compteur en même
temps. Mettre au premier plan la troisième, l’arrêter (CTRL-Z) puis la relancer en arrière plan.
– A l’aide des commandes jobs et kill, arrêter tous les compteurs.
– Même question en utilisant les commandes ps et kill (avec un PID).
5
Compréhension d’un programme
On considère le programme suivant. Indiquer le nombre de processus créés, le nombre total de processus, leur
relation de parenté, et l’affichage obtenu (combien de bonjour et de A+ ...).
int main() {
pid_t pid_p = -1;
int i=2;
Polytech
2011
1/ 2
e2i5
module Unix : programmation sytème en C sous Linux
int j=2;
while (i > 0 && pid_p!=0) {
pid_p = fork();
i--;
}
while (j > 0 && pid_p==0) {
pid_p = fork();
j--;
}
if (pid_p != 0) {
printf(”Bonjour\n”);
} else {
printf("A+\n”);
};
...
}
6
Multi-grep
On souhaite implanter en C un "multi-grep" qui exécute la commande standard Unix grep en parallèle. grep
permet de rechercher une chaîne de caractères dans un fichier et elle affiche les lignes où la chaîne apparaît.
L’exécution de votre programme devra être appelée de la manière suivante :
mgrep chaine liste-fichiers
Cette commande devra afficher, pour chaque fichier passé en paramètre, les lignes contenant la chaîne chaine.
Elle créera autant de processus fils que de fichiers à examiner.
6.1
Multi-grep simple
Ecrivez un programme C qui lance, pour chaque fichier passé en paramètre, un processus fils qui exécute le
grep standard. Le programme (c’est-à-dire le père) ne doit se terminer que lorsque tous les fils ont terminé.
6.2
Multi-grep à parallélisme contraint
On souhaite désormais ne créer simultanément qu’un nombre maximum MAXFILS de processus fils. Si le
nombre de fichiers est supérieur à MAXFILS, le processus père ne crée dans un premier temps que MAXFILS fils.
Dès qu’un des fils se termine et s’il reste des fichiers à analyser, le père recrée un nouveau fils.
Polytech
2011
2/ 2
Téléchargement