Bonjour,
J'ai une appli qui se compose de plusieurs processus, chacun d'entre eux devant savoir à tout moment si les autres sont ou non en cours.
Sous Windows :
Chaque processus crée un Mutex au démarrage. Chaque processus vérifie l'existence du Mutex des autres processus (en tentant de le créer) pour savoir si les autres processus tournent. Je ne souhaite pas utiliser la méthode consistant à lister les processus car lourd etc.
Bref, c'est une forme d'IPC très simpe et ça fonctionne parfaitement, sous Windows.
Sous Mac OS X :
Je cherche une solution équivalente.
J'ai jeté un oeil sur les sémaphores, mais je n'arrive pas à trouver comment créer un sémaphore nommé auquel d'autre processus pourraient accéder.
J'ai essayé d'utiliser un FileCreate en fmShareExclusive, mais si un processus plante sans l'avoir refermé, le fichier reste et on ne peut plus le créer.
Bref, je cherche quelque chose d'aussi simple et efficace que les Mutex Windows qui ont l'avantage de disparaître avec le processus même s'il se termine mal.
Mes contraintes :
Certains processus peuvent tourner dans la session de l'utilisateur (Ex : Une mise à jour de l'application)
D'autres sont des services (ou Daemon sur Mac OS) et ne tournent donc pas dans la même session.
Sous Windows, les Mutex sont créés de cette façon afin que chacun puisse y avoir accès :
Merci pour toute suggestion.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 function GetMutex(MutexName : string; KeepMutex : boolean):THandle; const MUTEX_GLOBAL = 'Global\'; //local use ET system account var MutexHandle : THandle; SecurityDesc: TSecurityDescriptor; SecurityAttr: TSecurityAttributes; ErrCode : integer; begin InitializeSecurityDescriptor(@SecurityDesc, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@SecurityDesc, True, nil, False); SecurityAttr.nLength:=SizeOf(SecurityAttr); SecurityAttr.lpSecurityDescriptor:=@SecurityDesc; SecurityAttr.bInheritHandle:=False; MutexHandle := CreateMutex(@SecurityAttr, True, PChar(MUTEX_GLOBAL + MutexName)); ErrCode := GetLastError; if (ErrCode = ERROR_ALREADY_EXISTS) then begin result := 0; closeMutex(MutexHandle); end else begin result := MutexHandle;; if not KeepMutex then begin CloseMutex(MutexHandle); // Qui fait le CloseHandle end; end; end;
Partager