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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Les étapes
  5. 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;
    }
    `

    • 5
    • 6
    • 5 puis 6
    • 11
    Voir la réponse

    5

    Le fils travaille sur une copie de x : son x = x + 1 ne 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 avec getppid().

  • 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 exec lui-même, il serait remplacé par ls. Il crée donc un fils sacrifiable, reste bloqué dans waitpid pendant que ls tourne, et récolte son statut, ce qui évite aussi le zombie.