Linux userspace : IPC avec semget et phénomène de course à la création

Linux userspace : IPC avec semget et phénomène de course à la création - C - Programmation

Marsh Posté le 03-10-2006 à 08:06:46    

Bonjour !
 
Je suis en train de coder un programme nécessitant un mécanisme de communication inter process. En fait, mon application pourrait être lancée un nombre illimité de fois, chaque exécution se passant dans un contexte différent.
Mon problème, c'est la création du sémaphore gerant l'accès exclusif à certaines ressources partagées.
 
si j'ai bien compris, il suffit de faire un  
 

Code :
  1. semid = semget(UNIQUE_KEY, 1, 0666 |IPC_CREAT);
  2. semctl_arg.val = 1;
  3. semctl(semid, 0, SETVAL, semctl_arg);

 

Pour créer et initialiser un sémaphore à 1.
Cependant, je ne sais pas quel process crée le sémaphore en premier.
 
Apparemment, semget (.... 0666 | IPC_CREAT) ouvre le sémaphore s'il existe déja et le crée sinon. Donc ca pourrait aller, je pourrais utiliser le même code dans tous mes process.
 
Par contre, l'initialisation du sémaphore à 1 ne doit se faire qu'une seule fois (problème si un process est en train de re-initialiser le semaphore à 1 alors qu'un autre le possède...).
 
La solution la plus simple serait de créer ce sémaphore avant tout lancement de mon application mais c'est plutôt lourd dans mon cas...
 
Quid aussi d'une application killée alors quelle avait le sémaphore?
 
Merci de vos conseils  :hello:

Reply

Marsh Posté le 03-10-2006 à 08:06:46   

Reply

Marsh Posté le 03-10-2006 à 08:59:57    

Alors d'après mes vagues souvenirs:
 
bah des que tu fera un

Code :
  1. struct sembuf bla[1];
  2. bla[0].sem_num = sem_num;
  3. bla[0].sem_op =  -1; // Pour bloquer les autres process
  4. bla[0].sem_flg = 0;
  5. semop(sem_id, bla, 1);


 
Cela va bloquer l'éxécution de tes autres processus (le premier bloquera les autres à ce niveau)
 
Une fois que ton processus aura terminé avec la zone critique:

Code :
  1. struct sembuf bla[1];
  2. bla[0].sem_num = sem_num;
  3. bla[0].sem_op =  1; // Pour débloquer un autre process
  4. bla[0].sem_flg = 0;
  5. semop(sem_id, bla, 1);


Remarques qu'il manque toutes les vérifs d'usage.
 
Il débloquera un autre process, qui aura été mis dans la file d'attente (qui n'est pas vraiment une file d'ailleurs, puisque ca ne sera pas forcément celui qui a été lancé juste après le premier qui sera débloqué).
 
Si ca a pu t'aider...
 
Edit: J'avais mal compris la question  [:iryngael]  
Euh pour moi, le mieux est d'effectivement initialiser tes sémaphores en premier avec un autre programme.


Message édité par Ayuget le 03-10-2006 à 09:03:39
Reply

Marsh Posté le 03-10-2006 à 09:04:27    

Oui tout cela c'est pour l'utilisation des semaphores, et vu que semop est atomique, ça fonctionnera sans le moindre souci.
 
Mon problème, c'est un phénomène de course à la création/ouverture du sémaphore...
 
Merci quand même pour ta réponse ;)

Reply

Marsh Posté le 03-10-2006 à 09:09:53    

Caedes a écrit :

Oui tout cela c'est pour l'utilisation des semaphores, et vu que semop est atomique, ça fonctionnera sans le moindre souci.
 
Mon problème, c'est un phénomène de course à la création/ouverture du sémaphore...
 
Merci quand même pour ta réponse ;)


Tu pourrais envisager une zone de mémoire partagée où tu stockerais le nombre de processus en cours, ainsi, tu n'initialiserait ton sémaphore que pour le premier?
 
Désolé des réponses vagues, ca remonte à loin  [:adodonicoco]  
 

Reply

Marsh Posté le 03-10-2006 à 18:19:23    

Je pense qu'il faut utiliser IPC_CREAT | IPC_EXCL au lieu de simplement IPC_CREAT. Si semget echoue avec errno == EEXIST, ca veut dire que le semaphore existe deja, et tu refais simplement un semget sans IPC_EXCL (tu n'as pas besoin de IPC_CREAT non plus, mais c'est du detail). Si au contraire semget reussit, ca veut dire que le semaphore n'existait pas et qu'il a ete cree. Dans ce cas, et dans ce cas seulement, tu l'initialises avec semctl(SETVAL).
 
Edit : il vaudrait peut-etre mieux utiliser les semaphores POSIX (sem_open, sem_post, sem_wait...), qui sont plus recents, mieux concus et plus simples.


Message édité par matafan le 03-10-2006 à 18:24:34
Reply

Sujets relatifs:

Leave a Replay

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