Bon_sang | J'ai mis un handle sur le signal SIGINT (ctrl+c) de tous mes processus.
Pour les synchroniser j'utilise un sémaphore.
Mais j'ai l'impression que quand un processus est bloqué, il ne reçoit plus du tout les signaux, meme aprés avoir repris la main.
Y a-t-il une option à la con que je n'ai pas encore trouvé qui permette aux processus bloqués d'etre débloqués pour recevoir les signaux ? ou qu'il les exécute dés qu'il reprend la main ?
Voici un exemple qui devrait se compiler à coup sur avec un gcc sur une station Sun solaris 9.
Pour les autres, je ne sais pas. mais y'a que des fork, des printf, et des manips de sémaphores.
En espérant que c'est clair ...
Code :
- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #define forever for(;;)
- // Déclaration des prototypes des fonctions
- void gerer_pere(void);
- void gerer_fils(void);
- void gerer_sigint(int sig);
- // Déclaration des variables globales
- int pidf=0;
- // Initialisation pour les sémaphores
- union semun
- {
- int val;
- struct semid_ds *buf;
- ushort *array;
- };
- union semun arg;
- int semid;
- struct sembuf prendre={0,1,0},liberer={0,-1,0},attendre={0,0,0};
- struct sembuf attente_prise[2]={{0,0,0},{0,1,0}},liberer_sem1={1,-1,0};
- ushort sem_val_init[2]={0,1};
- int main(int argc,char *argv[])
- {
- //initialisations spécifiques aux sémaphores
- key_t cle; // Clé unique du syteme IPC
- // Création de la clé
- if ((cle=ftok(argv[0],'0'))==-1)
- {
- printf("Probleme sur ftok\n" );
- exit(-1);
- }
- //obtention d'un identificateur pour les sémaphore, ouvert à tout le monde
- // sem 0 : pour gérer la réservation de la ressource
- // sem 1 : pour que dernier processus sache qu'il doit détruire les sémaphores
- if ((semid=semget(cle,2, IPC_CREAT|0666))==-1)
- {
- printf("impossible d'obtenir une clé\n" );
- exit(-1);
- }
- //initialisation du sémphore
- arg.array=sem_val_init;
- if (semctl(semid,2,SETALL,arg)==-1)
- {
- printf("Erreur à l'initialisation\n" );
- semctl(semid,IPC_RMID,NULL); // Effacement du sémaphore
- exit(-1);
- }
- // FIN des initialisations spécifiques aux sémaphores
- switch(pidf=fork())
- {
- case -1: //fork a renvoyé -1, c'est au père, il n'y a pas de fils car c'est un code d'échec
- {
- printf("Création du filsl impossible\n" );
- exit(-1);
- break;
- }
- case 0: // fork a renvoyé 0 : on est donc dans le processus fils processus fils
- {
- gerer_fils();
- break;
- }
- default: gerer_pere(); // fork a renvoyé une autre valeur : c'est le PID du fils pour le processus du père
- }
- raise(SIGINT);
- }
- void gerer_pere(void)
- {
- int i=0;
- signal(SIGINT,gerer_sigint);
- sleep(srand(getpid())%5);
- semop(semid,attente_prise,2); // Attente de libération de l'écran et prise s'il est libre
- printf("Pere actif: PID= %d\n",getpid());
- for (i=0;i<10;i++)
- {
- printf("Père\n" );
- sleep(1);
- }
- semop(semid,&liberer,1); // Libération de la ressource
- }
- void gerer_fils(void)
- {
- int i=0;
- signal(SIGINT,gerer_sigint);
- sleep(srand(getpid())%5);
- semop(semid,attente_prise,2); // Attente de libération de l'écran et prise s'il est libre
- printf("Fils actif: PID= %d\n",getpid());
- for (i=0;i<10;i++)
- {
- printf("Fils\n" );
- sleep(1);
- }
- semop(semid,&liberer,1); // Libération de la ressource
- }
- void gerer_sigint(int sig)
- {
- // Effacement du sémaphore : il faut le lire, mais sans bloquer le processus
- if (semctl(semid,1,GETVAL)==1) semop(semid,&liberer_sem1,1); //c'est le premier processus qui passe qui décrémente
- else semctl(semid,IPC_RMID,NULL); // Effacement des sémaphores
- exit(0);
- }
|
Message édité par Bon_sang le 20-09-2002 à 15:39:25
|