fork, exec et wait
Créer un processus avec fork, lui faire lancer un autre programme avec exec, l'attendre avec wait et son statut, et savoir ce que deviennent les orphelins et les zombies : prévoir ce que chaque processus affiche.
- 34 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Les étapes
- Mises en situation
Quelques cartes du deck
fork : de quoi s'agit-il ?
Voir la réponse
Appel système qui crée un nouveau processus, copie du processus appelant, et rend 0 dans la copie, le numéro de la copie dans l'original, -1 en cas d'échec.
Les deux processus reprennent à la ligne qui suit l'appel ; seule la valeur rendue les distingue, d'où le
if (pid == 0)qui sépare le code du fils de celui du père.Qu'affiche ce programme ?
```c
int main(void) {
int x = 5;
pid_t p = fork();
if (p == 0) {
x = x + 1;
return 0;
}
wait(NULL);
printf("%d\n", x);
return 0;
}`565puis611
Voir la réponse
5Le fils travaille sur une copie de
x: sonx = x + 1ne touche pas la variable du père, qui affiche toujours 5. Pour qu'un fils transmette une valeur, il faut un code de sortie, un tube ou une mémoire partagée.Après
fork, la valeur rendue vaut … dans le fils et, dans le père, le ….Voir la réponse
Après
fork, la valeur rendue vaut 0 dans le fils et, dans le père, le numéro du fils.Le père a besoin du numéro du fils pour l'attendre ou lui envoyer un signal ; le fils retrouve le sien avec
getpid()et celui de son père avecgetppid().Famille exec : de quoi s'agit-il ?
Voir la réponse
Appels système (
execl,execlp,execv,execvp...) qui remplacent le programme du processus appelant par un autre, sans créer de nouveau processus.Le numéro du processus reste le même, mais code, tas et pile sont remplacés : si l'appel réussit, il ne rend jamais la main, et la ligne suivante ne s'exécute que s'il a échoué.
Un shell exécute la commande ls : quelle étape vient après « Le shell appelle fork » ?
- Le fils appelle execvp("ls") et devient ls
- ls affiche son résultat puis appelle exit
- Le waitpid du shell rend le statut du fils
- Le shell affiche de nouveau l'invite
Voir la réponse
Le fils appelle execvp("ls") et devient ls
Le shell ne peut pas faire
execlui-même, il serait remplacé parls. Il crée donc un fils sacrifiable, reste bloqué danswaitpidpendant quelstourne, et récolte son statut, ce qui évite aussi le zombie.