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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1451146
Caedes
Posté le 03-10-2006 à 08:06:46  profilanswer
 

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:

mood
Publicité
Posté le 03-10-2006 à 08:06:46  profilanswer
 

n°1451169
Ayuget
R.oger
Posté le 03-10-2006 à 08:59:57  profilanswer
 

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
n°1451173
Caedes
Posté le 03-10-2006 à 09:04:27  profilanswer
 

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 ;)

n°1451176
Ayuget
R.oger
Posté le 03-10-2006 à 09:09:53  profilanswer
 

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]  
 

n°1451699
matafan
Posté le 03-10-2006 à 18:19:23  profilanswer
 

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

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

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

 

Sujets relatifs
creation vortex stargate en flash[C/Linux] Probleme de communication UDP
Conio.h et linuxCreation d'un mini client ftp
[Projet-divers]Creation d'album web rapideRécupérer la date de création d'un fichier
Date de création d'un fichierlimitation connexion serveur linux en c
creation d'un forumProblème création champ | Wampserveur
Plus de sujets relatifs à : Linux userspace : IPC avec semget et phénomène de course à la création


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