Un signal traduit l'apparition d'un événement asynchrone à l'exécution d'un processus.



Documents pareils
Cours de S.E. les Signaux

Programmation système en C/C++

Cours 6 : Tubes anonymes et nommés

Introduction aux Systèmes et aux Réseaux

Cours Programmation Système

Les processus 2/54. Qu est-ce qu un processus? 3(6)/54. Se souvenir 1(1)/54. Le système de fichiers (exemple du disque dur)

ENSP Strasbourg (Edition ) Les Systèmes Temps Réels - Ch. DOIGNON. Chapitre 3. Mise en œuvre : signaux, gestion du temps et multi-activités

LEs processus coopèrent souvent pour traiter un même problème. Ces

Communication Interprocessus

Exécutif temps réel Pierre-Yves Duval (cppm)

Le traitement du temps

Qu'est-ce qu'un processus: Définitions

Plan global. Programmation système II. Socket du domaine UNIX. Plan. Socket UNIX, Terminaux, Async IO, Mémoire, ELF.

3IS - Système d'exploitation linux - Programmation système

Le système GNU/Linux IUP NTIC /11/05

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Programmation système

Programmation système de commandes en C

Programmation système I Les entrées/sorties

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Système et réseaux (SR1) Gestion des utilisateurs

Playing with ptrace() for fun and profit

Les processus. Système L3, /39

Le prototype de la fonction main()

GESTION DES FICHIERS C/UNIX

Systèmes d exploitation

DUT Informatique Module Système S4 C Département Informatique 2009 / Travaux Pratiques n o 5 : Sockets Stream

Le système de gestion des fichiers, les entrées/sorties.

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

TRAVAUX PRATIQUES Programmation Système Langage C / Système UNIX. 2 e année Génie Informatique

Les processus légers : threads. Système L3, /31

Cours de Systèmes d Exploitation

Unix : Programmation Système

Chapitre 2. Les processus. 2.1 Introduction. 2.2 les différents états d un processus

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Protocoles DHCP et DNS

Formation Technicien Supérieur de Support en Informatique T2SI. Le module LINUX. Session J04 Version 01

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Conventions d écriture et outils de mise au point

Séance n o 5 : Alternatives, gestion des utilisateurs et des processus

Introduction à la Programmation Parallèle: MPI

Programmation défensive

Dans le chapitre 1, nous associions aux fichiers ouverts des descripteurs de fichiers par lesquels nous accédions aux fichiers.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Introduction au langage C

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Chapitre 4 : Outils de communication centralisés entre processus

OS Réseaux et Programmation Système - C5

Un ordonnanceur stupide

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Architecture d un système d exploitation

Arguments d un programme

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Communication par sockets

I. Introduction aux fonctions : les fonctions standards

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Programmation Système (en C sous linux) Rémy Malgouyres LIMOS UMR 6158, IUT département info Université Clermont 1, B.P.

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Bases de programmation. Cours 5. Structurer les données

Programmation C. Apprendre à développer des programmes simples dans le langage C

Outils pour la pratique

Algorithmique et Programmation, IMA

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Chapitre IX : Virtualisation

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

TP3 : Manipulation et implantation de systèmes de fichiers 1

Guide d'installation de la base de données ORACLE 10g ( ) pour linux FEDORA CORE 4.

Utiliser des logiciels Windows sous Linux Ubuntu

Programmation impérative

Cloner un disque dur

Compression de Données - Algorithme de Huffman Document de Conception

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

La Comptabilité UNIX System V Acctcom

Problèmes liés à la concurrence

La programmation des PIC en C. Les fonctions, les interruptions.

Python Les fondamentaux du langage

Exercice sur les Dockers

Chapitre 2 Devine mon nombre!

Premiers Pas en Programmation Objet : les Classes et les Objets

Systèmes d exploitation Gestion de processus

Installation software

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours de Système : Gestion de Fichiers

Les messages d erreur d'applidis Client

2010 Ing. Punzenberger COPA-DATA GmbH. Tous droits réservés.

Projet gestion d'objets dupliqués

eps Network Services Alarmes IHM

Les structures de données. Rajae El Ouazzani

ACTIVITÉ DE PROGRAMMATION

Cours d initiation à la programmation en C++ Johann Cuenin

Structure d un programme

Introduction à la programmation concurrente

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Le service FTP. M.BOUABID, Page 1 sur 5

Transcription:

Les signaux Un signal traduit l'apparition d'un événement asynchrone à l'exécution d'un processus. Il peut être généré par : Le noyau (par exemple, si un processus accède une zone mémoire non autorisée - signal SIGSEGV) Un appel système kill qui permet d'envoyer un signal vers un processus identifié par son pid. Le processus lui même (par exemple, un processus initialise une alarme (appel alarm) et lorsque que cette alarme expire, le noyau lui envoie le signal SIGALRM). la frappe d'une touche par l'utilisateur du terminal (par exemple [CTRL- C] génère le signal SIGINT dont l'action par défaut est de terminer le processus). Contrôle des signaux A chaque signal est associé un pointeur vers une fonction qui est appelée lors de l'activation du signal. Il est possible de modifier le pointeur de cette fonction sauf pour les signaux SIGKILL et SIGSTOP, Trois comportements sont possibles dans la gestion des signaux : c'est la fonction par défaut du Kernel qui traite le signal l'utilisateur fournit une fonction pour traiter le signal l'activation du signal est ignorée Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.1

7-2) Type de signaux Pour le programmeur un signal est représenté dans le système par un nom de la forme SIGXXX. Signaux provoqués par une exception matérielle Posix précise que le comportement d'un programme qui ignore les signaux d'erreur du type SIGFPE, SIGILL,SIGSEGV, SIGBUS est indéfini. SIGFPE SIGILL Floating-point exception : envoyé lors d'un problème avec une opération en virgule flottante mais il est aussi utilisé pour l'erreur de division entière par zéro. L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. Ce fichier est alors utilisé par l'outil de "debugger" gdb. Illegal instruction : envoyé au processus qui tente d'exécuter une instruction illégale. Ceci ne doit jamais se produire dans un programme normal mais il se peut que le fichier exécutable soit corrompu ( erreur lors du chargement en mémoire). L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. SIGSEV SIGBUS Segmentation violation : envoyé lors d'un adressage mémoire invalide (emploi d'un pointeur mal initialisé). L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. Bus error : envoyé lors d'une erreur d'alignement des adresses sur le bus. L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. SIGTRAP Trace trap : envoyé après chaque instruction, il est utilisé par les programmes de mise au point (debug). L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. Signaux de terminaison ou d'interruption de processus SIGHUP SIGINT Hangup : envoyé à tous les processus attachés à un terminal lorsque celui-ci est déconnecté du système. Il est courant d'envoyer le signal à certains processus démons afin de leur demander de se réinitialiser. L'action par défaut est la miseà mort du processus. Interrupt : le plus souvent déclenché par [CTRL-C]. L'action par défaut est la mise à mort du processus. SIGQUIT Quit : similaire à SIGINT mais pour [CTRL] [\]. L'action par défaut est la mise à mort du processus en créant un fichier d'image mémoire core. SIGIOT I/O trap instruction : émis en cas de problème hardware (I/O). core Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.2

SIGABRT SIGKILL SIGTERM Abort : Arrêt immédiat du processus (erreur matérielle). core Kill : utilisé pour arrêter l'exécution d'un processus. L'action par défaut est non modifiable. Software termination : C'est le signal qui par défaut est envoyé par la commande kill. L'action par défaut est la mise à mort du processus. Signaux utilisateurs SIGUSR1 User defined signal 1 : Définie par le programmeur. L'action par défaut est la mise à mort du processus. SIGUSR2 User defined signal 2 : idem que SIGUSR1. Signal généré pour un tube SIGPIPE Signal d'erreur d'écriture dans un tube sans processus lecteur. L'action par défaut est la mise à mort du processus. Signaux liés au contrôle d'activité SIGCLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU Signal envoyé au processus parent lorsque les processus fils terminent. Aucune action par défaut. L'action par défaut est de reprendre l'exécution du processus s'il est stoppé. Aucune action si le processus n'est pas stoppé. Suspension du processus. L'action par défaut est la suspension (!! non modifiable). Emission à partir d'un terminal du signal de suspension [CTRL-Z]. Ce signal à le même effet que SIGSTOP mais celui-ci peut être capturé ou ignoré. L'action par défaut est la suspension. Est émis par le terminal en direction d'un processus en arrière-plan qui essaie de lire sur le terminal. L'action par défaut est la suspension. Est émis par le terminal en direction d'un processus en arrière-plan qui essaie d'écrire sur le terminal. L'action par défaut est la suspension. Signal lié à la gestion des alarmes SIGALRM Alarm clock : généré lors de la mise en route du système d'alarme par l'appel système alarm(). Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.3

kill La fonction kill() permet d'envoyer un signal à un processus int kill (pid_t pid, int sig); Retourne 0 si OK, -1 si erreur Si l'argument pid est positif, le signal est envoyé au processus identifié par pid. est nul, le signal est envoyé aux processus du groupe du processus émetteur. est égal à -1, le signal est envoyé à tous les processus, sauf le processus init. est inférieur à -1, le signal est envoyé au groupe de processus identifié par la valeur absolue de pid. Si l'argument sig est zéro, une simulation d'émission de signal est réalisée c'est-à-dire qu'aucun signal n'est généré mais la fonction retourne les mêmes valeurs que dans le cas standard. Ce qui permet par exemple de tester la validité d'un PID. Si une erreur s'est produite la variable errno contient l'une des valeurs suivantes: EINVAL : Signal invalide ESRCH : Le processus ou groupe de processus n'existe pas. EPERM : L'euid du processus appelant est différente de celle du processus cible. Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.4

signal void (*signal (int signum, void (*handler) (int))) (int) ; Retourne le pointeur de fonction du signal si OK, la constante SIG_ERR si erreur Le premier argument signum est le numéro du signal (qui doit être différent de SIGKILL ou SIGSTOP). Le second argument handler définit la nouvelle disposition à associer au signal; ce sera l'adresse d'une fonction ou l'une des constantes symboliques SIG_DFL (traitement par défaut) ou SIG_IGN (le signal est ignoré). La fonction de déroutement prend en paramètre un entier correspondant au signal qui l'a activée et ne renvoie aucun argument. Cette fonction semble devenir obsolète et est remplacée par la fonction POSIX : sigaction( ) pause int pause( void ); Retourne -1 avec errno valant EINTR L'appel système pause() endort indéfiniment un processus dans un mode interruptible. Le processus reprendra son cours à l'arrivée d'un signal si celuici n'est pas inhibé, ignoré ou si la fonction associée ne conduit pas le processus à terminer. Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.5

/**************************************************************** * Nom : sig1.c * But : Se protéger des signaux * SIGINT : [CTRL] [C] * SIGTERM : kill pid * qui par défaut arrêtent le processus. ****************************************************************/ #include<stdio.h> int main(int argc, char *argv[] ) int nbrsec; if (argc<2) printf("erreur : --> Appel : sig1 nbr_sec \n"); sscanf(argv[1],"%d",&nbrsec); if (signal(sigint, SIG_IGN)== SIG_ERR) /* CTRL C */ perror("sigint"); if (signal(sigterm, SIG_IGN) == SIG_ERR) /* KILL -TERM pid */ perror("sigterm"); sleep(nbrsec); exit(0); Essai jpol@isil007:~> gcc Wall o sig1 sig1.c jpol@isil007:~> sig1 30 & [1] 423 jpol@isil007:~> kill -TERM 423 jpol@isil007:~> ps PID TTY STAT TIME COMMAND 131 1 S 0:00 -bash 423 1 S 0:00 sig1 30 424 1 R 0:00 ps jpol@isil007:~> Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.6

/*********************************************************** * Nom : sig2.c * But : Dérouter les signaux SIGUSR1 et SIGUSR2 ************************************************************/ #include<stdio.h> void handler( int) ; int main() if ( signal(sigusr1, handler) == SIG_ERR) perror("sigusr1"); if ( signal(sigusr2, handler) == SIG_ERR) perror("sigusr2"); while(1) pause(); void handler( int signo) if (signo == SIGUSR1) printf("signal SIGUSR1 reçu \n"); else printf("signal SIGUSR2 reçu \n"); Essais jpol@isil007:~> sig2& [1] 151 jpol@isil007:~> kill -USR1 151 Signal SIGUSR1 reçu jpol@isil007:~> kill -USR2 151 Signal SIGUSR2 reçu jpol@isil007:~> kill -USR1 151 Signal SIGUSR1 reçu jpol@isil007:~> kill -TERM 151 jpol@isil007:~> ps PID TTY STAT TIME COMMAND 131 1 S 0:00 -bash 152 1 R 0:00 ps [1]+ Terminated sig2 jpol@isil007:~> Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.7

alarm C'est un appel système qui permet de générer, à l'attention du processus appelant, un signal SIGALRM après un certain nombre de secondes (la valeur 0 provoque l'annulation de l'alarme). #include<unistd.h> unsigned alarm ( unsigned sec); Retourne 0 ou le nombre de secondes qui restait dans son compteur avant l'émission d'un nouvel appel. La nouvelle alarme annule l'ancienne. /*********************************************************************** * Nom : sleep1.c * Buts : Version simplifiée de la fonction sleep(). * Utilisation de l'appel système alarm(). **********************************************************************/ #include<stdio.h> #include<unistd.h> void sig_alarm( int signo) /* Ne rien faire */ return; /* Réveille le pause */ int sleep1( unsigned nsecs) if (signal(sigalrm, sig_alarm) == SIG_ERR) return (nsecs); alarm(nsecs); /* Démarrer le timer */ pause(); /* Endormir la fonction en attente d'un signal */ /* Poursuite de la fonction après réception d'un signal */ return( alarm(0) ); /* Arrète le timer et retourne le nombre de secondes qui reste dans le compteur */ int main() printf("attente de 5 secondes\n"); sleep1(5); printf("fin du traitement\n"); exit(0); Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.8

/********************************************************************** * Nom : sig3.c * But : Effectuer un read avec timeout **********************************************************************/ #include<stdio.h> #include<unistd.h> #define MAXCAR 100 void sig_alarm( int signo) /* Ne rien faire */ return; /* Interrompre le read */ int main() int n; char ligne[maxcar]; if (signal(sigalrm, sig_alarm) == SIG_ERR) perror("sigalrm"); siginterrupt( SIGALRM, 1); printf("entrez une ligne?\n"); alarm(5); /* Démarrer le timer */ fgets(ligne,maxcar-1,stdin); if(alarm(0)) printf("%s",ligne); else printf("timeout\n"); printf("fin du traitement\n"); exit(0); Essais: jpol@isil007:~> gcc Wall -o sig3 sig3.c jpol@isil007:~> sig3 Entrez une ligne? Timeout Fin du traitement jpol@isil007:~> sig3 Entrez une ligne? isil isil Fin du traitement jpol@isil007:~> Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.9

Les appels système interruptibles Si au cours d'un appel système (donc en mode noyau) un processus est amené à attendre des ressources temporairement indisponibles, il est endormi par le noyau. Dans certains cas l'arrivée d'un signal va réveiller le processus, c'est-à-dire le rendre à nouveau éligible sans considération de la libération de la ressource et provoquer un retour prématuré de l'appel système. La valeur de retour de l'appel système est alors généralement -1, et la variable errno contient la valeur EINTR. Afin de gérer le comportement d'un programme en cas d'interruption par un signal, les systèmes BSD fournissent la fonction siginterrupt(3c) int siginterrupt( int sig, int flag); Retourne 0 si OK, -1 si erreur Si la valeur du flag est nulle, un appel système sera relancé s'il est interrompu par le signal sig. est égale à 1 et qu'aucune donnée n'a été transférée, alors un appel système interrompu par le signal sig renvoie -1 et la variable errno contient la valeur EINTR. est égale a 1 et que des données ont été transférées, alors un appel système interrompu par le signal sig renvoie la quantité de données transférées. Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.10

Exemple: /************************************************************************** * Nom : sigread.c * But : Utiliser la fonction siginterrupt pour contrôler une lecture * bloquante sur le descripteur 0. *************************************************************************/ #include<unistd.h> #include<stdio.h> #include<errno.h> void sig_suspend( int numero) printf("gestionnaire (CTRL-Z) \n"); int main() int car; if (signal(sigtstp, sig_suspend) == SIG_ERR) perror("sigtstp"); printf("utilisation de siginterrupt avec flag=0 \n"); siginterrupt(sigtstp, 0); printf("entrez un caractère? \n"); if ( read(0, &car, sizeof(car)) <0) if (errno == EINTR ) printf("errno=eintr\n"); printf("voici le caractère : %c\n", car); printf("utilisation de siginterrupt avec flag=1 \n"); siginterrupt(sigtstp, 1); printf("entrez un caractère? \n"); if ( read(0, &car, sizeof(car)) <0) if (errno == EINTR ) printf("errno=eintr\n"); else printf("voici le caractère : %c\n", car); exit(0); Essais: jpol@isil007:~ > gcc -Wall -o sigread sigread.c jpol@isil007:~ > sigread Utilisation de siginterrupt avec flag=0 Entrez un caractère? Gestionnaire (CTRL-Z) CTRL Z Gestionnaire (CTRL-Z) CTRL Z k k (enter) Voici le caractère : k Utilisation de siginterrupt avec flag=1 Entrez un caractère? Gestionnaire (CTRL-Z) CTRL Z errno=eintr jpol@isil007:~ > Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.11

Les fonctions réentrantes Si une fonction est appelée comme fonction de déroutement d'un signal elle peut provoquer des erreurs dans le déroulement du processus. En effet, certaines fonctions de bibliothèques manipulent des données statiques et ne sont pas réentrantes. Par exemple, la fonction malloc gère les zones mémoire sous forme de listes chaînées: si un signal intervient durant l'appel à cette fonction et que la fonction de déroutement fait également appel à malloc, les listes risquent d'être dans un état incohérent et le fonctionnement du processus risque donc d'être erroné. Il est donc préférable d'utiliser uniquement des fonctions réentrantes dans les fonctions de déroutement. POSIX.1 spécifie les fonctions qui sont garanties être réentrantes : _exit fork pipe stat abort fstat read sysconf access getegid rename tcdrain alarm geteuid rmdir tcflow cfgetispeed getgid setgid tcflush cfgetospeed getgroups setpgid tcgetattr cfsetispeed getpgrp setsid tcgetpgrp cfsetospeed getpid setuid tcsendbreak chdir getppid sigaction tcsetattr chmod getuid sigaddset tcsetpgrp chown kill sigdelset time close link sigemptyset times creat longjmp sigfillset umask dup lseek sigismember uname dup2 mkdir signal unlink execle mkfifo sigpending utime execve open sigprocmask wait exit pathconf sigsuspend waitpid fcntl pause sleep write Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.12

sigaction #include <signal.h> int sigaction ( int signum, const struct sigaction *nouveau, struct sigaction *ancien ); Retourne 0 si OK, -1 si erreur Le premier paramètre représente le signal à dérouter. Les deuxième et troisième paramètres sont respectivement le nouveau et l'ancien comportement à adopter à l'arrivée du signal. Si le pointeur nouveau est différent de NULL, alors le système modifie l'action du signal signum. Si le pointeur ancien est différent de NULL, alors le système retourne l'action précédente qui était prévue pour le signal signum. Si les pointeurs nouveau et ancien sont NULL, l'appel système teste uniquement la validité du signal. Définition de la structure sigaction: struct sigaction void (*sa_handler()) (); /* Fonction de déroutement,sig_ign ou SIG_DFL*/ sigset_t sa_mask; /* Liste des signaux qui sont bloqués durant l'exécution de la fonction de déroutement */ unsigned long sa_flags; /* Options définissant le comportement du processus à la réception du signal*/ ; Le signal ayant déclenché l'exécution du gestionnaire est automatiquement bloqué sauf si on demande explicitement le contraire ( option SA_NODEFER). Les options possibles pour sa_flags: Options SA_NOCLDSTOP SA_ONESHOT, SA_RESETHAND SA_RESTART SA_NOMASK SA_NODEFER Signification Si le signal est SIGCHLD alors ne pas recevoir de signal (SIGSTOP, SIGSTP, GIGTTIN, SIGTTOU)lorsque le processus fils se suspend. Réinstaller la fonction de déroutement par défaut après la réception du signal. Relancer automatiquement l'appel système interrompu par la réception du signal. Ne pas bloquer la réception du signal durant l'exécution de la fonction de déroutement. Les erreurs possibles pour cet appel sont : EINVAL signum est un signal invalide EFAULT nouveau ou ancien contient une adresse invalide Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.13

Exemple: /************************************************************************ * Nom : sigaction.c * But : Utiliser la fonction sigaction pour contrôler une lecture * bloquante sur le descripteur 0. * Une seconde occurence du signal SIGTSTP déclenchera le * comportement par défaut prévu pour ce signal. ************************************************************************/ #include<unistd.h> #include<stdio.h> #include<errno.h> void sig_suspend( int numero) printf("gestionnaire (CTRL-Z) \n"); int main() int car; struct sigaction action; action.sa_handler=sig_suspend; sigemptyset( &(action.sa_mask)); action.sa_flags= SA_RESTART SA_ONESHOT; if (sigaction(sigtstp, &action, NULL)!= 0) perror("sigtstp"); printf("entrez un caractère? \n"); if ( read(0, &car, sizeof(car)) <0) if (errno == EINTR ) printf("errno=eintr\n"); else printf("voici le caractère : %c\n", car); exit(0); Essais: jpol@isil007:~ > gcc -Wall -o sigaction sigaction.c jpol@isil007:~ > sigaction Entrez un caractère? Gestionnaire (CTRL-Z) CTRL Z k k (enter) Voici le caractère : k jpol@isil007:~ > sigaction Entrez un caractère? Gestionnaire (CTRL-Z) CTRL Z CTRL Z (ONE_SHOT -> mise à mort du processus) [1]+ Stopped sigaction jpol@isil007:~ > Programmation dans l'environnement Linux Les signaux ( adaptés des notes de J-P Conniasselle) Tr 10.14