:: Enseignements :: ESIPE :: E4INFO :: 2014-2015 :: Programmation système en C ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | pipe(), dup() et dup2() |
Exercice 1 - Tentative de détournement, à mains nues
Écrire un programme qui redirige la sortie standard vers un fichier, puis effectue un
"
ls" vers ce fichier. Il faut donc ouvrir ce fichier avec
open(), puis utiliser
dup2()
afin que les accès ultérieurs à la sortie standard se fassent sur le fichier. Ensuite, on peut faire un
execlp()
pour lancer
ls -l, et l'affichage se fera vers le fichier.
Exercice 2 - Tentative de détournement, à la fourchette
- Révisions sur fork() (car fork est prérequis pour ce TD!):
écrire un programme qui exécute le programme spécifié sur la ligne de commande, et en fonction de
son code de retour, affiche "OK" ou "ERREUR". Rappels: pour récupérer le code de retour, utiliser waitpid();
et OK correspond à un code de retour nul. Exemple: programme [ "toto" = "titi" ] doit afficher ERREUR.
N'hésitez pas à consulter la manpage de la commande [, c'est instructif
(man bash).
- Modifier le programme précédent pour qu'il n'affiche rien d'autre que OK ou ERREUR, c'est-à-dire que
le programme qui sert de "condition" ne doit rien afficher. Pour l'empêcher de faire de l'affichage,
on propose de rediriger ses sorties vers le fichier /dev/null. Attention, il ne faut pas
faire un simple exec mais un fork+exec. Attention aussi à ne détourner les
sorties standard que dans le fils, afin que le père puisse encore afficher OK ou ERREUR à la fin du programme.
Exercice 3 - Il est passé par ici, il repassera par là
En utilisant
fork(), créer deux processus communiquant par un tube (lui-même créé avec l'appel
système
pipe()). Le fils lira depuis l'entrée standard et écrira dans le tube les caractères
mis en majuscules avec
toupper(). Le père lira depuis le tube et écrira sur la sortie standard.
Exercice 4 - Le fils rationne et se suicide; le père en meurt de chagrin
Reprendre l'exercice précédent. Cette fois, c'est le père qui écrit (octet par octet, par exemple) et le fils
qui lit. Le fils devra simplement répéter sur la sortie standard ce qu'il a lu, mais en
s'arrêtant au bout de 10 caractères (comme la commande "
head -c10"). Ensuite, le fils
termine son exécution. On souhaite aussi que le père termine lorsque le fils termine.
Plusieurs solutions sont possibles:
- Utiliser SIGCHLD afin que le père constate la terminaison du fils.
- Fermer soigneusement les descripteurs de fichiers inutilisés (par exemple, après le fork(),
chaque processus ferme la moitié du tube qu'il n'utilise pas). La prochaine écriture dans le tube
provoquera un SIGPIPE dans le père.
© Université de Marne-la-Vallée