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.
- Notions
- Questions
- Ranger et relier
- 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 pidenvoie 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);`AfinAAAfinfinfinA
Voir la réponse
AfinLes trois signaux se fondent en un seul signal en attente. Il est délivré dès le déblocage, avant que
sigprocmaskne rende la main : le « A » précède donc « fin ». Programme exécuté : la sortie est bienAfin.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,
psmontre 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 :killn'y change rien.