Différences entre versions de « C signals »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
(Page créée avec « = Introduction = Il est intéressant de récupérer les signaux afin de pouvoir les interpréter dans un programme. Cela permet de simplifier l’interaction avec l'utilis... »)
 
 
(2 versions intermédiaires par un autre utilisateur non affichées)
Ligne 10 : Ligne 10 :
 
</source>
 
</source>
 
* signo &rarr; le signal à attraper ;
 
* signo &rarr; le signal à attraper ;
* func &rarr; un pointeur vers la fonction a exécuter.
+
* func &rarr; un pointeur vers la fonction à exécuter.
 
* le code retour varie entre :
 
* le code retour varie entre :
 
**la valeur précédente du gestionnaire de signaux ;
 
**la valeur précédente du gestionnaire de signaux ;
Ligne 40 : Ligne 40 :
 
puts("Utilisez SIGINT pour interrompre l'exécution !");
 
puts("Utilisez SIGINT pour interrompre l'exécution !");
 
// Enregistrement du gestionnaire de signaux
 
// Enregistrement du gestionnaire de signaux
signal(SIGINT, sig_handler);
+
if(signal(SIGINT, sig_handler) == SIG_ERR){
 +
puts("Erreur à l'enregistrement du gestionnaire de signaux !");
 +
}
 
// Boucle infinie
 
// Boucle infinie
 
while(end == 0);
 
while(end == 0);
Ligne 46 : Ligne 48 :
 
}
 
}
 
</source>
 
</source>
 +
Voici un exemple d'output:
 +
<pre>
 +
$ ./signal.bin
 +
Utilisez SIGINT pour interrompre l'exécution !
 +
^C
 +
SIGINT attrapé, on stop le programme 3630
 +
</pre>

Version actuelle datée du 1 novembre 2018 à 20:07

Introduction

Il est intéressant de récupérer les signaux afin de pouvoir les interpréter dans un programme. Cela permet de simplifier l’interaction avec l'utilisateur qui veut, par exemple, interrompre, redémarrer ou encore arrêter le programme.

Utilisation

Pour enregistrer une fonction gestionnaire de signaux, il faut utiliser la fonction suivante:

#include <signal.h>

int signal (int signo, void * func);
  • signo → le signal à attraper ;
  • func → un pointeur vers la fonction à exécuter.
  • le code retour varie entre :
    • la valeur précédente du gestionnaire de signaux ;
    • SIG_ERR en cas d'erreur et errno est positionné.

Le prototype de la fonction gestionnaire est le suivant:

void * sig_handler(int signo);

Exemple

Ci-dessous un exemple qui attrape le signal SIGINT (ctrl+c):

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// Indicateur de fin de programme
int end = 0;

// Gestionnaire de signaux
void sig_handler(int sig) {
	printf("\nSIGINT attrapé, on stop le programme %i\n", getpid());
	end = 1;
}

int main(void) {
	puts("Utilisez SIGINT pour interrompre l'exécution !");
	// Enregistrement du gestionnaire de signaux
	if(signal(SIGINT, sig_handler) == SIG_ERR){
		puts("Erreur à l'enregistrement du gestionnaire de signaux !");
	}
	// Boucle infinie
	while(end == 0);
	return EXIT_SUCCESS;
}

Voici un exemple d'output:

$ ./signal.bin 
Utilisez SIGINT pour interrompre l'exécution !
^C
SIGINT attrapé, on stop le programme 3630