Version sans JavaScript, en lecture seule : les ateliers, les quiz et l’exécution du code n’y sont pas. Version complète · Catalogue · Se connecter
Feuille d'exercices 6
Processus Compter les processus créés par fork, comprendre ce que copie fork, écrire system et un petit shell, récupérer ses zombies, compter des signaux. Chapitre 6.
Les programmes se compilent avec gcc -std=c11 -Wall -Wextra -Werror -D_POSIX_C_SOURCE=200809L.
Exercice · Combien de lignes ?
Combien de lignes chacun de ces programmes affiche-t-il ? On ne compte que le corps de main, les #include <stdio.h> et <unistd.h> sont sous-entendus. Dessiner l'arbre des processus.
Deux fork à la suite :
fork();
fork();
printf("x\n" );
Dans une boucle :
for (int i = 0 ; i < 3 ; i++)
fork();
printf("x\n" );
Seul le fils recommence :
if (fork() == 0 )
fork();
printf("x\n" );
Le fils s'arrête aussitôt :
for (int i = 0 ; i < 3 ; i++) {
if (fork() == 0 ) {
printf("fils %d\n" , i);
return 0 ;
}
}
printf("père\n" );
Exercice · Qu'est-ce que fork copie ?
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main(void )
{
int n = 1 ;
if (fork() == 0 ) {
n = 100 ;
printf("fils : n = %d, &n = %p\n" , n, (void *)&n);
return 0 ;
}
wait(NULL );
printf("père : n = %d, &n = %p\n" , n, (void *)&n);
return 0 ;
}
Qu'affiche ce programme ? Les deux adresses sont-elles les mêmes ? Comment une même adresse peut-elle contenir deux valeurs différentes ? On ajoute printf("début ");, sans passage à la ligne, juste avant le fork. Qu'affiche maintenant le programme ?
Exercice · Écrire system
La bibliothèque standard fournit int system(const char *cmd), qui fait exécuter la commande cmd par le shell, attend sa fin et rend son statut. Écrire mon_system, qui fait la même chose avec fork, execl et waitpid : elle lance /bin/sh -c cmd, et rend le statut rempli par waitpid (à décoder avec WIFEXITED et WEXITSTATUS), ou -1 si le fork échoue.
Vérifier que mon_system("echo bonjour; exit 3") affiche bonjour et que son code de retour est 3, et que mon_system("ls | wc -l") marche : pourquoi le tube fonctionne-t-il sans qu'on ait rien fait pour ?
Exercice · Un shell un peu moins minimal
On part du shell minimal du chapitre 6.
Taper cd /tmp, puis pwd. Que se passe-t-il ? Pourquoi cd ne peut-il pas être un programme comme les autres ? Ajouter la commande interne cd (sans argument, elle ramène au répertoire HOME). On utilisera chdir et getenv. Ajouter la redirection de la sortie : ls -l > liste.txt. Le > et le nom du fichier sont séparés du reste par des espaces.
Exercice · Des zombies en série
Un programme crée cinq fils, qui se terminent aussitôt avec les codes 0, 1, 2, 3 et 4.
Si le père ne les attend pas et dort une minute, que montre ps pendant cette minute ? Écrire le père pour qu'il les récupère tous et affiche le pid et le code de chacun, sans connaître leurs pid à l'avance. Un serveur ne peut pas s'arrêter pour attendre ses fils : il doit continuer à répondre. Comment peut-il les récupérer au fur et à mesure ?