Simple Prozesskommunikation mittels Mutex



  • Hallo,
    ich bin grade dabei ein Programm zuschreiben, welches einen anderen Prozess von mir "überwacht". Ich habe versucht das ganze mit einer Mutexfunktion zu machen, aber das funktioniert nicht wie ich will.
    Der Mutex wird vom Hauptprozess erstellt. Mein Überwachungsprozess überprüft dann ob der Mutex noch existiert, wenn nicht wird eine Meldung ausgegeben.
    Ist der Mutex noch vorhanden und wurde "released" dann soll erstmal auch nur eine Meldung ausgegeben werden.
    Das Problem ist jetzt das die Funktion OpenMutex() immer ein gültiges Handle zurück gibt selbst wenn das Mutex Object nicht mehr vorhanden ist und die Funktion WaitForSingleObject() gibt auch WAIT_OBJECT_0 zurück selbst wenn der Hauptprozess nicht mehr vorhanden ist.
    Hier der Code:

    int UeberwacheProzess(char *MutexName) {
    	HANDLE hMutex;
    	DWORD result;
    	int err;
    
    	err = 0;
    
    	while(err == 0) {
    
    		hMutex = OpenMutex(SYNCHRONIZE  ,TRUE,MutexName);
    
    			if(hMutex == NULL)  {
    				MessageBox(NULL,"Main process is not longer active","Information",MB_OK);	
    				return 1;
    			}				
    			else {
    
    				result = WaitForSingleObject(hMutex,10000);
    
    				if(result == WAIT_OBJECT_0) {
    					MessageBox(NULL,"Mutex object released..","Information",MB_OK);
    					err = 1;
    				}
    
    			}					
    
    	}
    	return 0;
    }
    

    Habe anscheinend irgendwo einen kleinen Fehler drin, finde ihn aber leider nicht.
    Hoffe jemand von euch kann das Problem nachvollziehen und mir weiterhelfen.



  • Was du brauchst, ist ein Prozess Handle:
    CreateToolhelp32Snapshot\Process32First\Next ->PROCESSENTRY32.szExeFile vergleichen -> PID -> OpenProcess() -> WaitForSingleObject()



  • Die Funktionen kenne ich, habe aber ganz bewusst Mutex Objecte ausgewählt.
    Das Object soll ja dann auch "released" werden.
    Also wenn möglich eine Lösung mittels Mutex....



  • r0ot schrieb:

    Das Problem ist jetzt das die Funktion OpenMutex() immer ein gültiges Handle zurück gibt selbst wenn das Mutex Object nicht mehr vorhanden ist und die Funktion WaitForSingleObject() gibt auch WAIT_OBJECT_0 zurück selbst wenn der Hauptprozess nicht mehr vorhanden ist.

    Das ist richtig so. OpenMutex gibt Dir ein gültiges Handle zurück, solange Du das einmal erzeugte Mutex-Handle nicht mit CloseHandle geschlossen hast. Und da der zu überwachende Prozess ReleaseMutex aufgerufen hat, zeigt Dein WaitForSingleObject mit WAIT_OBJECT_0 an, dass nun der überwachende Prozess das Mutex-Handle besitzt. Hätte der zu überwachende Prozess das Mutex-Objekt noch nicht released, würdest Du hier WAIT_ABANDONED (schlecht) oder WAIT_TIMEOUT (jemand anderes besitzt das Mutex-Objekt) bekommen. Siehe auch
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx


Anmelden zum Antworten