synchronisation de processus sans lien de parenté

synchronisation de processus sans lien de parenté - C - Programmation

Marsh Posté le 08-01-2005 à 21:20:54    

Bonjour, je voudrais savoir s'il existe un mécanisme équivalent au mutex pour synchroniser des processus qui n'ont _aucun_ lien de parenté (à la limite, ils ont le même nom c'est à dire à dire qu'il s'agit de plusieurs instances du même processus mais je ne sais pas si ca va aider).
 
Parsque la mémoire partagée c'est bien mais on perd l'atomicité et on pourrait avoir un conflit non ? Entre le temps de récupérer la valeur de la variable, de la tester, et avant de la décrémenter un autre processus passe par derrière et hop on est fouttu, non ?
 
Merci !

Reply

Marsh Posté le 08-01-2005 à 21:20:54   

Reply

Marsh Posté le 08-01-2005 à 21:34:05    

Tu peux faire des pipes entre tes process ou des sockets.

Reply

Marsh Posté le 08-01-2005 à 21:47:58    

Tu veux que quand un processus veut acceder a la ressource il lit le pipe et si y'a rien il attend, sinon il fait son job et quand il a finit il remet un caractere dans le pipe ? ... Ouais pourquoi pas !

Reply

Marsh Posté le 08-01-2005 à 22:06:35    

souliane a écrit :

Tu veux que quand un processus veut acceder a la ressource il lit le pipe et si y'a rien il attend, sinon il fait son job et quand il a finit il remet un caractere dans le pipe ? ... Ouais pourquoi pas !


 
Peut-etre qu'en precisant un peu plus ce que tu comptes faire, on pourrait mieux t'aiguiller (le pipe nomme reste unidirectionelle, si tu as besoin d'une reponse, tu dois passer par des sockets unix).

Reply

Marsh Posté le 08-01-2005 à 22:22:46    

Ben en fait je dois faire un mini-shell et les differentes instances du programme doivent se partager un historique qui est "stocké" dans un segment de memoire partagée. La premiere instance cree le segment et y copie le contenu du fichier historique, la derniere instance met a jour le fichier et detruit le segment. Ca se sont les consignes qu'il ne faut pas toucher.
 
Les processus doivent donc lire et ecrire regulierement dans le segment, qui contient :
 
- la representation en memoire du fichier
- les nombres de commandes (lignes) et de caracteres
- eventuellement le nombre d'instances ?
 
Ca c'est moi qui l'a voulu ainsi, je peux eventuellement changer un peu mais pas trop mais parsque je n'aurai pas le temps de tout refaire !
 
:)

Reply

Marsh Posté le 08-01-2005 à 22:49:58    

Sinon pour les pipes nommes alors j'en fait deux qui me servent de mutex sur la shm que je garde comme ci-dessus (en utilisant bcopy je peux y stocke mes int meme si je caste l'adresse que renvoie shmat en char *).
 
Pour les sockets je prefere eviter vu que je connais encore moins.

Reply

Marsh Posté le 09-01-2005 à 00:25:55    

-> il faut que tu utilies des semaphores nommés.
(cherche sur google named semaphore)
 
c'est comme un semaphore normal, ou un mutex.
sauf qu'il ont d'une maniere ou d'une autre un lien au systeme de fichier. Ce qui leur donne une portée globale, inter-processus.
 
Sylvain

Reply

Marsh Posté le 09-01-2005 à 00:51:29    

Ahhh, merci pour le tuyau ! Je vais regarde ca.

Reply

Marsh Posté le 10-01-2005 à 17:40:54    

c pas un tuyau (pipe) c un semaphore
ok je sort c t tres mauvais


---------------
  ____
Reply

Marsh Posté le 10-01-2005 à 19:35:14    

souliane a écrit :

Ben en fait je dois faire un mini-shell et les differentes instances du programme doivent se partager un historique qui est "stocké" dans un segment de memoire partagée. La premiere instance cree le segment et y copie le contenu du fichier historique, la derniere instance met a jour le fichier et detruit le segment. Ca se sont les consignes qu'il ne faut pas toucher.
 
Les processus doivent donc lire et ecrire regulierement dans le segment [...]


 
Si vous êtes sur une plateforme qui le supporte, autant utiliser un mutex stocké dans le segment avec l'attribut PTHREAD_PROCESS_SHARED (avec le setpshared qui va bien). Vous pouvez aussi utiliser un rwlock plutôt qu'un mutex histoire que ce soit joli.

Reply

Sujets relatifs:

Leave a Replay

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