Vous êtes sur la page 1sur 2

ème

TP : Système d’exploitation 1 2 LMD 2016-2017

TP3 : Signaux (Interruptions) en langage C sous Linux

Introduction : Quand un signal est envoyé à un processus, le système d'exploitation interrompt


l'exécution normale de celui-ci. Si le processus possède une routine de traitement pour le signal reçu,
il lance son exécution. Dans le cas contraire, il exécute la routine de traitement des signaux par
défaut.

Exemple 1 : Un programme qui boucle à l’infini, qui ne traite pas les interruptions.
main( ) { for( ;;) printf(“\n Je suis un processus infini “) ; }
En lançant ce programme infini, on peut envoyer l’une des interruptions clavier suivantes :
1) ctrl + c (SIGINT)
2) ctrl+ \ (SIGQUIT)
Ces interruptions arrêtent par défaut le programme en cours d’exécution.
Exemple 2 : Un programme qui boucle à l’infini, qui traite l’interruption SIGINT.
#include <stdio.h>
#include <signal.h>
void fonction( ) { printf(“\nTraitement de IT clavier\n”); }
main( ) { signal(SIGINT,fonction); /* signal ctrl+c */
for( ;;) printf(“\n Je suis un processus infini !!!!!! “) ; }
En lançant ce programme infini, à chaque fois qu’on appui sur la touche clavier ctrl + c, la fonction
“ affichage ()“ s’exécute.

Pour tester cet exemple sur ordinateur, il faut ajouter la fonction sleep(5) après le printf() (dans la
fonction affichage ou main) afin de pouvoir voir les différents affichages. La fonction sleep () permet
de suspendre l’exécution pendant l’intervalle de temps passé en paramètre (en secondes).

Exemple 3 : Un programme qui boucle à l’ infini qui ignore l’interruption clavier ctrl +\.
#include <stdio.h>
#include <signal.h>
main( ) { signal(SIGQUIT, SIG_IGN) ;
for( ;;) printf(“\n Je suis un processus infini !!!!!! “) ; }

On peut utiliser la fonction pause() pour attendre un signal. (#include<unistd.h>)

Exercice 1:

Implémenter le programme suivant


: #include <stdio.h>
#include
<signal.h> void
fonction_It( )
{
printf(“\nTraitement de IT
clavier\n”); sleep(5) ;
}
main( )
{
signal(SIGINT,fonction_It);
for( ; ; ) printf(“Je suis un processus infini“) ;
}
1. Exécuter ce programme dans un shell
2. Appuyer sur [Ctrl] + \
3. Que permet de faire la commande [Ctrl] + \
4. Relancer l’exécution du programme dans le shell
5. Appuyer sur [Ctrl] + c
6. Que permet de faire la commande [Ctrl] + c
7. Quel est le rôle de la fonction signal ?
8. Remplacer SIGINT par SIGQUIT et refaire les testes.
9. Remplacer le deuxième paramètre de la fonction signal (fonction_It) par SIG_IGN et
refaire les teste.

Exercice 2

Ecrire un programme qui affiche indéfiniment un message1 toutes les 10 secondes. Il affiche un
message2 à chaque arrivée du signal SIGQUIT et qui se termine en affichant un message3 à l’arrivée
du signal SIGINT.

Exercice 3

Ecrire un programme qui affiche indéfiniment un message1 toutes les 20 secondes. Il masque
(ignore) les interruptions clavier SIGINT et SIGQUIT.

Exercice 4

Le signal SIGFPE correspond théoriquement à une « Floating Point Exception », mais il n’est en fait
nullement limité aux erreurs de calcul en virgule flottante. Il inclut par exemple l’erreur de division
entière par zéro. Ecrire un programme principal qui effectue la division d’un nombre par zéro et un
sous-programme qui traite le déroutement provoqué par cette faute en affichant un message
d’erreur spécifique de votre choix..
Remarque : L'interruption numéro 0 (zéro) est appelée automatiquement par le processeur lui même
lorsque l'on tente d'effectuer la division d'un nombre entier par 0 (opérateur / en langage C).

Exercice 5

Le signal SIGSEGV correspond à une adresse mémoire correcte mais :


Soit pointant en dehors de l’espace d’adressage affecté au processus
Soit réalisant un accès interdit à une zone mémoire protégée.
Ecrire un programme qui écrit dans une zone mémoire à l’aide d’un pointeur sur cette zone. Le
programme fera progresser le pointeur indéfiniment jusqu’à tenter d’écrire hors de la zone visée
pour déclencher le signal SIGSEGV. Le sous programme de traitement de cette faute devra afficher
un message d’erreur spécifique.

Vous aimerez peut-être aussi