signal()
#include <stdio.h>
void (*signal(int signum, void (*handler)(int)))(int);
La fonction signal()
demande au système de lancer la fonction
handler
lorsque le signal signum
est reçu par le processus
courant. La fonction signal()
renvoie la fonction qui était
précédemment associée au même signal.
Il y a une trentaine de signaux différents,
La liste
complète des signaux, leur signification et leur comportement sont
décrits dans la page de manuel signal
(chapitre 7 pour
Linux).
parmi lesquels
SIGINT
(program interrupt, émis par Ctrl-C), SIGTST
(terminal stop, émis par Ctrl-Z)SIGTERM
(demande de fin de processus)SIGKILL
(arrêt immédiat de processus)SIGFPE
(erreur arithmétique),SIGALRM
(fin de délai, voir fonction alarm()
), etc.La fonction handler() prend en paramètre le numéro du signal reçu, et ne renvoie rien.
Exemple :
1 /* sig.c */
2 #include <stdlib.h>
3 #include <signal.h>
4 #include <errno.h>
5 #include <unistd.h>
6 #include <stdio.h>
7 void traitement(int signum)
8 {
9 printf("Signal %d => ", signum);
10 switch (signum) {
11 case SIGTSTP:
12 printf("Je m'endors....\n");
13 kill(getpid(), SIGSTOP); /* auto-endormissement */
14 printf("Je me réveille !\n");
15 signal(SIGTSTP, traitement); /* repositionnement */
16 break;
17 case SIGINT:
18 case SIGTERM:
19 printf("Fin du programme.\n");
20 exit(EXIT_SUCCESS);
21 break;
22 };
23 }
24 int main(void)
25 {
26 signal(SIGTSTP, traitement); /* si on reçoit contrôle-Z */
27 signal(SIGINT, traitement); /* si contrôle-C */
28 signal(SIGTERM, traitement); /* si kill processus */
29 while (1) {
30 sleep(1);
31 printf(".");
32 fflush(stdout);
33 };
34 printf("fin\n");
35 exit(EXIT_SUCCESS);
36 }
kill()
#include <unistd.h>
int kill(pid_t pid, int sig);
La fonction kill()
envoie un signal à un processus.
alarm()
#include <unistd.h>
long alarm(long delai);
La fonction alarm()
demande au système d'envoyer un signal
SIGALRM
au processus dans un délai fixé (en secondes). Si
une alarme était déjà positionnée, elle est remplacée. Un délai
nul supprime l'alarme existante.
pause()
La fonction pause()
bloque le processus courant jusqu'à ce qu'il
reçoive un signal.
#include<unistd.h>
int pause(void);
Exercice : Écrire une fonction équivalente à sleep()
.