Programmer avec les signaux

Envoyer un signal avec kill ou alarm, le recevoir avec sigaction et un gestionnaire, le masque et les signaux en attente, pause, SIGCHLD pour récolter les fils et les fonctions permises dans un gestionnaire.

  • 30 cartes
  • 4 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. Mises en situation

Quelques cartes du deck

  • Signal : de quoi s'agit-il ?

    Voir la réponse

    Notification asynchrone envoyée par le noyau ou par un autre processus, qui interrompt le déroulement normal du destinataire.

    Ctrl+C envoie SIGINT, kill pid envoie SIGTERM, un accès mémoire invalide déclenche SIGSEGV. Un signal ne porte aucune donnée : seulement son numéro.

  • Qu'affiche ce programme, dont le gestionnaire h écrit un « A » ?

    ```c
    signal(SIGUSR1, h);
    sigset_t m;
    sigemptyset(&m);
    sigaddset(&m, SIGUSR1);
    sigprocmask(SIG_BLOCK, &m, NULL);
    kill(getpid(), SIGUSR1);
    kill(getpid(), SIGUSR1);
    kill(getpid(), SIGUSR1);
    sigprocmask(SIG_UNBLOCK, &m, NULL);
    write(1, "fin\n", 4);
    `

    • Afin
    • AAAfin
    • fin
    • finA
    Voir la réponse

    Afin

    Les trois signaux se fondent en un seul signal en attente. Il est délivré dès le déblocage, avant que sigprocmask ne rende la main : le « A » précède donc « fin ». Programme exécuté : la sortie est bien Afin.

  • Un signal bloqué reste … ; si le même signal arrive trois fois pendant le blocage, le gestionnaire ne s'exécute qu'… fois au déblocage.

    Voir la réponse

    Un signal bloqué reste en attente ; si le même signal arrive trois fois pendant le blocage, le gestionnaire ne s'exécute qu'une fois au déblocage.

    Un signal standard est représenté par un simple bit « en attente » : les arrivées multiples se fondent en une seule.

  • Gestionnaire de signal : de quoi s'agit-il ?

    Voir la réponse

    Fonction du programme que le système appelle à l'arrivée d'un signal donné, avant de reprendre le code qui a été interrompu.

    Il peut s'exécuter entre deux instructions quelconques du programme. Il doit donc rester court et ne toucher qu'à des choses sûres, comme une variable volatile sig_atomic_t.

  • Un serveur crée un fils par client. Son gestionnaire de SIGCHLD appelle une seule fois wait(NULL). Quand cinq clients partent ensemble, ps montre des processus <defunct>. Quelle est la cause ?

    • wait ne récolte que les fils sortis par exit, pas ceux tués par un signal
    • Plusieurs SIGCHLD se sont fondus en un : un seul fils a été récolté
    • Les fils n'ont pas appelé exit avant de se terminer
    • wait ne marche pas dans un gestionnaire : il faut kill sur les zombies
    Voir la réponse

    Plusieurs SIGCHLD se sont fondus en un : un seul fils a été récolté

    Les signaux en attente ne se comptent pas : il suffit que les fils finissent pendant l'exécution du gestionnaire. Il faut boucler sur waitpid(-1, NULL, WNOHANG) jusqu'à ce qu'il rende 0 ou -1. Un zombie est déjà mort : kill n'y change rien.