Untitled
unknown
plain_text
4 years ago
4.4 kB
8
Indexable
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/stat.h>
int nombreSIGNAUX = 16;
void HandlerSIGUSR1();
void HandlerSIGRTMIN();
void HandlerSIGRTMAX();
void FonctionFils();
void SortieErreur();
int compteurSIGUSR1 = 1; // Compteur pour SIGUSR1
int compteurSIGRTMIN = 1 ; // Compteur pour SIGRTMIN
int compteurSIGRTMAX = 1 ; // Compteur pour SIGRTMAX
int main()
{
int idFils;
int i;
if ((idFils = fork()) == -1)SortieErreur();
if (!idFils)FonctionFils();
sleep(1); //Laisser le temps au fils d'armer ses signaux
/* ----------------------------------------------------
ENVOI D'UN SIGNAL DONNE A UN PROCESSUS
SIGNAL : SIGUSR1,
PROCESSUS : idFils.
----------------------------------------------------- */
for (i = 0; i < nombreSIGNAUX ; i++)
{
printf ("Main >> Envoi du signal SIGUSR1 %d !\n", i+1);
if ((kill (idFils, SIGUSR1)) == -1)SortieErreur();
}
/* ----------------------------------------------------
ENVOI D'UN SIGNAL DONNE A UN PROCESSUS
SIGNAL : SIGRTMIN,
PROCESSUS : idFils.
----------------------------------------------------- */
for (i = 0; i < nombreSIGNAUX; i++)
{
printf ("Main >> Envoi du signal SIGRTMIN %d !\n", i+1);
if ((kill (idFils, SIGRTMIN)) == -1)SortieErreur();
}
/* ----------------------------------------------------
ENVOI D'UN SIGNAL DONNE A UN PROCESSUS
SIGNAL : SIGRTMAX,
PROCESSUS : idFils.
----------------------------------------------------- */
for (i = 0; i < nombreSIGNAUX; i++)
{
printf ("Main >> Envoi du signal SIGRTMAX %d !\n", i+1);
if ((kill (idFils, SIGRTMAX)) == -1)SortieErreur();
}
return 0;
}
void FonctionFils()
{
/* DECLARATION POUR L'UTILISATION DES SIGNAUX */
struct sigaction sigact;
sigset_t mask;
sigfillset(&mask);
sigprocmask(SIG_SETMASK, &mask, NULL);
/* ----------------------------------------------------
DEFINIR LE COMPORTEMENT DU PROCESSUS COURANT
POUR UN SIGNAL DONNE
COMPORTEMENT : HANDLER
HandlerSIGUSR1,
SIGNAL : SIGUSR1,
FLAGS : SA_SIGINFO.
----------------------------------------------------- */
sigact.sa_handler = HandlerSIGUSR1;
//sigact.sa_flags = SA_SIGINFO; // Permet le queining, éviter de perdre les signaux
if ((sigaction(SIGUSR1, &sigact,0))==-1)SortieErreur();
/* ----------------------------------------------------
DEFINIR LE COMPORTEMENT DU PROCESSUS COURANT
POUR UN SIGNAL DONNE
COMPORTEMENT : HANDLER
HandlerSIGRTMIN,
SIGNAL : SIGRTMIN,
FLAGS : SA_SIGINFO.
----------------------------------------------------- */
sigact.sa_handler = HandlerSIGRTMIN;
// sigact.sa_flags = SA_SIGINFO; // Permet le queining, éviter de perdre les signaux
if ((sigaction(SIGRTMIN, &sigact,0))==-1)SortieErreur();
/* ----------------------------------------------------
DEFINIR LE COMPORTEMENT DU PROCESSUS COURANT
POUR UN SIGNAL DONNE
COMPORTEMENT : HANDLER
HandlerSIGRTMAX,
SIGNAL : SIGRTMMAX,
FLAGS : SA_SIGINFO.
----------------------------------------------------- */
sigact.sa_handler = HandlerSIGRTMAX;
// sigact.sa_flags = SA_SIGINFO; // Permet le queining, éviter de perdre les signaux
if ((sigaction(SIGRTMAX, &sigact,0))==-1)SortieErreur();
sleep(5);//Laisser le temps au père d'envoyer ses signaux
sigfillset(&mask);
sigdelset(&mask, SIGUSR1); // SIGUSR1 peut recevoir
sigdelset(&mask, SIGRTMIN); // SIGRTMIN peut recevoir
sigdelset(&mask, SIGRTMAX); // SIGRTMAX peut recevoir
sigprocmask(SIG_SETMASK, &mask, NULL); // On applique le masque
sleep(50);
exit(0);
}
/* ----------------------------------------------------
GESTIONNAIRE DE SIGNAUX.
----------------------------------------------------- */
void HandlerSIGUSR1()
{
printf("HandlerSIGUSR1 >> Signal %d recu !\n",compteurSIGUSR1++);
}
void HandlerSIGRTMIN()
{
printf ("HandlerSIGRTMIN >> Signal %d recu !\n",compteurSIGRTMIN++);
}
void HandlerSIGRTMAX()
{
printf ("HandlerSIGRTMAX >> Signal %d recu !\n",compteurSIGRTMAX++);
}
void SortieErreur()
{
perror("");
exit(0);
}
Editor is loading...