Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider 9abcf5b2 rédigé par Sebastien FAUCOU's avatar Sebastien FAUCOU
Parcourir les fichiers

ajout du tp4 sur les signaux.

parent 90e65100
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
# Introduction
## Appels systèmes et fonctions utiles
En plus des informations disponibles dans le support de cours et dans
vos notes, on trouve un panorama du fonctionnement des signaux UNIX dans
la page `signal(7)` du manuel en ligne. Des explications complémentaires
concernant la sûreté de certaines fonctions et appels systèmes
lorsqu'ils sont appelés depuis un gestionnaire de signal sont données
dans la page `signal-safety(7)`. Enfin, les fonctions suivantes
disposent également de pages dédiées dans le manuel :
- `sigaction` : installer un gestionnaire de signal?
- `sigprocmask` : changer le masque des signaux bloqué par le
processus.
- `sigemptyset`, `sigfillset`, `sigdelset`, `sigaddset` : créer et
manipuler un masque de signaux.
- `sigsuspend` : met le processus appelant en pause jusqu'à l'arrivée
d'un signal parmi un ensemble sélectionné par un masque.
- `kill` : envoyer un signal à un processus.
- `pause` : met le processus appelant en attente d'un signal.
# Travail à réaliser
## Variables volatiles et mises à jour atomiques
``` c
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
int exit_flag = 0;
void handler(int sig) {
exit_flag = 1;
}
int main(void) {
struct sigaction action;
memset(&action, '\0', sizeof(action));
action.sa_handler = handler;
sigaction(SIGTERM, &action, NULL);
while (!exit_flag);
printf("End.\n");
exit(EXIT_SUCCESS);
}
```
L'exercice porte sur le programme ci-dessus.
1. Comment peut-on faire en sorte que le programme sorte de la boucle,
affiche le message `"End.\n"` et se termine ?
2. Compiler le programme à l'aide de la commande suivante : `gcc -Wall
-O0 <nomfichier.c> -o <nomprog>` et vérifier votre réponse à la
question précédente.
3. Même question en utilisant la commande `gcc -Wall -O2 <nomfichier.c>
-o <nomprog>`. Commenter.
4. Corriger le programme en conséquence. Pour cela, il sera utile de se
renseigner sur le mot-clé `volatil` et le type `sig_atomic_t`.
## Masques et signaux bloqués
Soit un programme conforme à la spécification suivante. Pour commencer,
le programme installe un gestionnaire pour le signal `SIGCHLD`.
Lorsqu'il est appelé, ce gestionnaire passe la variable globale `go` à
`1`. Ensuite, le programme se clone. Le processus enfant bloque tous les
signaux puis entre dans une boucle infinie. Le processus parent entre
dans une boucle dont il sort lorsque la variable `go` vaut `1`. Il
attend ensuite la terminaison du processus enfant, dont il affiche la
cause et le cas échéant, le signal responsable.
1. Est-il possible de faire se terminer le processus enfant ?
2. Écrire le programme et vérifier votre réponse à la question
précédente.
## Interruption des appels systèmes
``` c
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
static volatile sig_atomic_t counter = 0;
void handler(int sig)
{
counter ++;
return;
}
int main(void)
{
struct sigaction action;
pid_t pid;
int i;
memset(&action, '\0', sizeof(action));
action.sa_handler = handler;
sigaction(SIGUSR1, &action, NULL);
pid = fork();
if (pid == 0)
{
for(i = 0; i < 42; i++)
{
kill(getppid(), SIGUSR1);
printf("signal sent %d times to parent\n", i+1);
}
}
else
{
wait(NULL);
printf("final value: %d\n", counter);
getchar();
}
exit(0);
}
```
1. Sans exécuter le programme ci-dessus, expliquer ce qu'il fait.
2. Compiler le programme, l'exécuter et vérifier votre réponse à la
question ci-dessus.
3. Corriger le problème (un indice est donné dans le titre de
l'exercice).
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter