Académique Documents
Professionnel Documents
Culture Documents
monexec echo a b
1
DMI Génie Logiciel - S5
a b
monexec
Usage: monexec commande [arg] [arg] ?
monexec toto titi
execvp: No such file or directory
3. Simultanéité vs. séquentialité
(a) Ecrire un programme C équivalent à la commande shell suivante :
who & ps & ls -l
(b) Ecrire un programme C équivalent à la commande shell suivante :
who ; ps ; ls -l
Exercice 4 (EX/Cond/BFR/LF)
Passage des paramètre et exclusion mutuelle
1. Modifiez le programme de la question précédente pour passer son numéro d’ordre à chaque thread. Chaque thread doit
ensuite l’afficher. Vérifiez que le numéro d’ordre affiché par chaque thread est bien différent.
2. Déclarez une variable globale somme initialisée à 0. Chaque thread doit, dans une boucle, ajouter 1 000 000 fois son
numéro d’ordre à cette variable globale (on veut bien faire 1 000 000 additions par thread, pas juste une). Affichez la
valeur obtenue après la terminaison de tous les threads.
3. Avec 5 threads (numérotés de 0 à 4), on devrait obtenir (0+1+2+3+4)*1 000 000 = 10 000 000. Corrigez votre pro-
gramme s’il n’affiche pas systématiquement ce résultat.
4. Modifiez votre programme pour ne plus utiliser de variables globales. Il faut donc passer les adresses des différentes
variables nécessaires en argument en thread , dans une structure.
}
else
{
close ( fd [ 1 ] ) ;
w h i l e ( r e a d ( f d [ 0 ] , &c , 1) >0)
{
c = toupper ( c ) ;
sleep (1);
w r i t e ( 1 , &c , 1 ) ;
}
f p r i n t f ( s t d e r r , ” l e c t e u r f i n \n ” ) ;
}
return 0;
}
1. Lisez et comprenez le code. Lancez le programme et testez-le en tapant une chaı̂ne de caractères suivie de Return
puis de Control − d (marque de fin de fichier sous UNIX : l’utilisateur ferme le flux de lecture de l’interpréteur).
Que se passe-t-il lorsqu’on enlève la ligne close(fd[1]) ? Pourquoi ?
2. Faites en sorte que le père soit l’écrivain.
3. Remplacez le code du lecteur (lignes 18 à 24) par un appel à execl. Vous écrirez pour cela un petit programme
indépendant qui jouera le rôle de ce lecteur.
Remarque :même après un appel à exec, les numéros des descripteurs de fichiers font toujours référence aux mêmes fichiers.
2. Ecrire un programme C dont le comportement est une boucle infinie et qui écrit à l’écran ” BONJOUR ” lorsqu’il
reçoit le signal SIGUSR1 et ” BONSOIR ” lorsqu’il reçoit le signal SIGUSR2. Ce programme ne doit réagir qu’une
seule fois au signal SIGUSR1. Par contre il doit réagir autant de fois que le signal SIGUSR2 lui arrive.
Indice : Regarder la fonction pause() dans le manuel. Attention l’action par défaut des signaux SIGUSR1 et SIGUSR2
est la terminaison.
3. Ecrire un programme dans lequel un processus crée un fils et initialise un handler (afficher ” BONJOUR ”) sur
SIGUSR1. Le fils affiche des informations à l’écran puis envoie le signal SIGUSR1 à son père. Attention le programme
fils doit se terminer avant le processus père.
Voir le DL Numéro 1