Echauffement
Créez le programme fork_chain.c. Ce programme créé une "chaîne" de 4 processus: le processus P1 créé P2, P2 crée P3, et P3 crée P4.
Chaque processus, en plus d'engendrer un processus fils, affiche son PID et son PPID. Le dernier processus de la chaîne exécute la commande ps f grâce à la fonction system.
La commande ps f lancée par P4 affiche-t-elle tous les processus (P1, P2, P3, P4) ? Non ?
Modifiez le programme pour faire "travailler" les processus P2 et P3 avant leur appel à fork. On peut utiliser sleep(1) pour "simuler" un travail d'une seconde.
Observez l'affichage produit par le programme
Modifiez le programme afin que chaque processus attende la terminaison de ses fils avant de se terminer.
La solution actuelle fonctionne, mais elle engendre des processus inutilement: la fonction system crée un processus shell qui crée un processus exécutant la commande ps f.
Utilisez la fonction execlp à la place de la fonction system.
Shell
Avant de commencer cet exercice, téléchargez l'archive TP7.tgz et extrayez la.
Le programme mysh.c est une base permettant d'implémenter un shell rudimentaire. Une boucle demande à l'utilisateur de saisir une commande, la chaîne de caractère est transformée en un tableau de mot (par la fonction extract_command), et le tableau est ensuite passé à la fonction execute_command chargée d'exécuter la commande.
Complétez la fonction execute_command pour que les commandes saisies par l'utilisateur soient exécutées. Pour cela, utilisez la fonction system.
En tapant la commande ps f, on voit que mysh crée un processus sh qui crée un processus ps. Quel gaspillage des ressources de l'ordinateur !
Nous allons plutôt créer un processus fils qui va utiliser la fonction execvp pour exécuter la commande. Il est également nécessaire que le processus père attente la terminaison du processus fils qu'il vient de créer avant de poursuivre son exécution.
Au fait, êtes vous sûr que le programme travaille "proprement" ? Utilisez valgrind pour détecter les éventuels problèmes mémoire et corrigez les.
On souhaite maintenant pouvoir lancer des processus en arrière-plan (en ajoutant & à la fin de la commande). Lorsque l'utilisateur lance une commande en arrière-plan, la fonction extract_command supprime le & final et position le champs mode à mode_background.
Modifiez votre code pour n'attendre la fin du processus fils que si la commande est lancée en avant-plan. Dans le cas contraire, affichez un message indiquant le PID du processus fils lancé en arrière plan. Par exemple:
Lorsqu'un processus qui s'exécutait en arrière-plan se termine, il le signale à son processus père. Dans un shell classique (comme bash), cela provoque l'affichage d'un message indiquant quel processus s'est terminé. Par exemple:
Implémentez un mécanisme qui, après l'exécution d'une commande, vérifie si un processus fils s'est terminé. Si c'est le cas, le shell affiche le PID du processus qui s'est terminé:
Avec le shell bash, lorsqu'un processus en arrière-plan se termine, son PID est affiché accompagné de la commande ayant engendré le processus.
Complétez votre implémentation pour qu'elle affiche également la commande ayant permis de créer le processus qui vient de se terminer: