Délivrance de signaux et processus blogué par un sémaphore

Délivrance de signaux et processus blogué par un sémaphore - C++ - Programmation

Marsh Posté le 20-09-2002 à 15:33:48    

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 :
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <signal.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/sem.h>
  7. #define forever for(;;)
  8. // Déclaration des prototypes des fonctions
  9. void gerer_pere(void);
  10. void gerer_fils(void);
  11. void gerer_sigint(int sig);
  12. // Déclaration des variables globales
  13. int pidf=0;
  14. // Initialisation pour les sémaphores
  15. union semun
  16. {
  17. int val;
  18. struct semid_ds *buf;
  19. ushort *array;
  20. };
  21. union semun arg;
  22. int semid;
  23. struct sembuf prendre={0,1,0},liberer={0,-1,0},attendre={0,0,0};
  24. struct sembuf attente_prise[2]={{0,0,0},{0,1,0}},liberer_sem1={1,-1,0};
  25. ushort sem_val_init[2]={0,1};
  26. int main(int argc,char *argv[])
  27. {
  28. //initialisations spécifiques aux sémaphores
  29. key_t cle;   // Clé unique du syteme IPC
  30. // Création de la clé
  31. if ((cle=ftok(argv[0],'0'))==-1)
  32. {
  33. printf("Probleme sur ftok\n" );
  34. exit(-1);
  35. }
  36. //obtention d'un identificateur pour les sémaphore, ouvert à tout le monde
  37. // sem 0 : pour gérer la réservation de la ressource
  38. // sem 1 : pour que dernier processus sache qu'il doit détruire les sémaphores
  39. if ((semid=semget(cle,2, IPC_CREAT|0666))==-1)
  40. {
  41. printf("impossible d'obtenir une clé\n" );
  42. exit(-1);
  43. }
  44. //initialisation du sémphore
  45. arg.array=sem_val_init;
  46. if (semctl(semid,2,SETALL,arg)==-1)
  47. {
  48. printf("Erreur à l'initialisation\n" );
  49. semctl(semid,IPC_RMID,NULL);  // Effacement du sémaphore
  50. exit(-1);
  51. }
  52. // FIN des initialisations spécifiques aux sémaphores  
  53. switch(pidf=fork())
  54. {
  55. 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
  56.  {
  57.  printf("Création du filsl impossible\n" );
  58.  exit(-1);
  59.  break;
  60.  }
  61. case 0:  // fork a renvoyé 0 : on est donc dans le processus fils processus fils  
  62.  {
  63.  gerer_fils();
  64.  break;
  65.  }
  66. default: gerer_pere(); // fork a renvoyé une autre valeur : c'est le PID du fils pour le processus du père
  67. }
  68. raise(SIGINT);
  69. }
  70. void gerer_pere(void)
  71. {
  72. int i=0;
  73. signal(SIGINT,gerer_sigint);
  74. sleep(srand(getpid())%5);
  75. semop(semid,attente_prise,2); // Attente de libération de l'écran et prise s'il est libre
  76. printf("Pere actif: PID= %d\n",getpid());
  77. for (i=0;i<10;i++)
  78. {
  79. printf("Père\n" );
  80. sleep(1);
  81. }
  82. semop(semid,&liberer,1);  // Libération de la ressource
  83. }
  84. void gerer_fils(void)
  85. {
  86. int i=0;
  87. signal(SIGINT,gerer_sigint);
  88. sleep(srand(getpid())%5);
  89. semop(semid,attente_prise,2); // Attente de libération de l'écran et prise s'il est libre
  90. printf("Fils actif: PID= %d\n",getpid());
  91. for (i=0;i<10;i++)
  92. {
  93. printf("Fils\n" );
  94. sleep(1);
  95. }
  96. semop(semid,&liberer,1);  // Libération de la ressource
  97. }
  98. void gerer_sigint(int sig)
  99. {
  100. // Effacement du sémaphore : il faut le lire, mais sans bloquer le processus
  101. if (semctl(semid,1,GETVAL)==1) semop(semid,&liberer_sem1,1); //c'est le premier processus qui passe qui décrémente
  102. else semctl(semid,IPC_RMID,NULL); // Effacement des sémaphores
  103. exit(0);
  104. }


Message édité par Bon_sang le 20-09-2002 à 15:39:25
Reply

Marsh Posté le 20-09-2002 à 15:33:48   

Reply

Marsh Posté le 27-09-2002 à 11:31:33    

Et y a-t-il d'autres endoits où chercher sur le web sur ce sujet ?
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed