Écrire un programme qui capte le signal sigusr1 et affiche un message à l’écran lorsque le signal est envoyé au processus :
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>/** * La fonction à exécuter lorsqu'un signal est envoyé * ==> GESTIONNAIRE DE SIGNAUX */void signal_handler(int n_sig){ switch (n_sig) { case SIGUSR1: printf("Signal SIGUSR1 reçu !\n"); break; } return;}int main (){ printf("Processus PID : %d\n", getpid()); // Peut recevoir un signal SIGUSR1 int sig = signal(SIGUSR1, signal_handler); // Gestion erreur if(sig == SIG_ERR) exit(EXIT_FAILURE); // Envoi le signal SIGUSR1 au fils kill(getpid(), SIGUSR1); while(1) pause(); return 0;}
kill -USR1 [PID]
Signal SIGUSR1 reçu !
Masquer le signal sigusr1 et afficher les signaux pendants
#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <unistd.h>void signal_handler(int sig) { if (sig == SIGUSR1) { printf("Signal SIGUSR1 reçu et traité !\n"); }}int main() { printf("PID du processus : %d\n", getpid()); /* Installer le gestionnaire */ if (signal(SIGUSR1, signal_handler) == SIG_ERR) { perror("signal"); exit(EXIT_FAILURE); } sigset_t mask, pending; // Création des ensembles signaux masqués et pendants sigemptyset(&mask); // Init sigaddset(&mask, SIGUSR1); // Ajout du signal SIGUSR1 sigprocmask(SIG_BLOCK, &mask, NULL); // Bloquer SIGUSR1 printf("SIGUSR1 est maintenant MASQUÉ\n"); kill(getpid(), SIGUSR1); printf("SIGUSR1 envoyé pendant le masquage\n"); sleep(1); sigpending(&pending); // ensemble des signaux masqués if (sigismember(&pending, SIGUSR1)) { // Vérifier si SIGUSR1 est un signal masqué printf("SIGUSR1 est en attente (pending)\n"); } else { printf("SIGUSR1 n'est PAS en attente\n"); } printf("Démasquage de SIGUSR1...\n"); sigdelset(&mask, SIGUSR1); while(2) pause(); return 0;}