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 :

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;
Merci pour toute suggestion.