AISE – Architecture Interne d'un Système d'Exploitation

Portail informatique

TP – Les signaux

Les signaux sont des messages envoyés entre processus. Techniquement, le message est un numéro, et un processus peut envoyer le message sig au processus pid en appelant la fonction int kill(pid_t pid, int sig);. La bibliothèque C définie des macros permettant de remplacer des numéros de signaux par des numéros. Par exemple SIGINT est utilisé en remplacement du signal numéro 2.

Par défaut, le système d'exploitation utilise déjà un certain nombre de signaux :
  • SIGINT : envoyé par le shell lorsque vous pressez ctl-c.
  • SIGSEGV : envoyé par le système lorsque le processus effectue un accès mémoire invalide.

A quelques rares exceptions près, par défaut, un processus meurt lorsqu'il reçoit un signal. Vous pouvez changer ce comportement à l'aide de la fonction int sigaction(int sig, struct sigaction* new, struct sigaction* old);. La structure sigaction décrit le comportement à associer à la réception d'un signal dans le processus courant. La méthode sigaction associe le comportement new au signal sig et met dans old l'ancien comportement.

De façon simplifiée, la structure sigaction contient les attributs suivants :
struct sigaction { void (*sa_handler)(int); /* méthode invoquée lors de la réception d'un signal */ sigset_t sa_mask; /* signaux masqués pendant la réception, vous metterez ce champs à 0 en utilisant la fonction sigemptyset */ int sa_flags; /* un drapeau spécifiant des comportements avancés, que vous metterez à SA_NODEFER */ };
L'attribut sa_handler peut aussi faloir SIG_DFL pour remettre le comportement par défaut ou SIG_IGN pour simplement ignorer le signal.

Jouons avec les signaux

Écrivez un programme en C effectuant une boucle infinie. Votre programme doit afficher "coucou" lorsqu'il reçoit un signal SIGINT. Ce signal est facile à générer en pressant ctl-c dans le terminal.

Modifiez votre programme pour qu'il affiche aussi "youpi" lorsqu'il reçoit un signal SIGQUIT. Dans un second terminal, repérez le PID de votre processus à l'aide de la commande ps aux et utilisez la commande kill pour lui envoyer un signal SIGQUIT.

En utilisant la méthode alarm (pensez à utiliser les pages de man), modifiez votre programme pour qu'il reçoive un signal SIGALRM toutes les secondes. Lors de la réception d'un SIGALRM, votre programme doit afficher "alarme!".