Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1181 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°217748
Bon_sang
Posté le 20-09-2002 à 15:33:48  profilanswer
 

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
mood
Publicité
Posté le 20-09-2002 à 15:33:48  profilanswer
 

n°221214
Bon_sang
Posté le 27-09-2002 à 11:31:33  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
C++ Builder : obtenire la liste des processusCommunication inter processus sous linux
processusprocessus caches sous XP NT 2000
[VB] Processus qui s'arrête avant la fin des traitements.Sémaphore/Données critiques en C sous Windows
Gestion des signaux/processus en C ...[C++Builder] Processus et tache de fond
Communication par signaux entre thread 
Plus de sujets relatifs à : Délivrance de signaux et processus blogué par un sémaphore


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR