3 Stimmen

Ereignisobjekt im Interprozess verwenden

Ich versuche, ein Ereignisobjekt in einer Win32-Umgebung zu verwenden, um zwei Prozesse zu synchronisieren. Im Folgenden sind die vereinfachten Code von zwei Programmen.

// process1
int main()
{
    HANDLE h = CreateEvent(NULL, FALSE, FALSE, TEXT("Hello"));
    WaitForSingleObject(h, INFINITE);
//  RunProcess(L"process2.exe", L"");
}

// process2
int main()
{
    HANDLE h = OpenEvent(EVENT_MODIFY_STATE, FALSE, TEXT("Hello"));
    SetEvent(h);    
}

Es ist recht einfach und funktioniert gut, wenn zwei Prozesse unabhängig voneinander gestartet werden. Es funktioniert jedoch nicht, wenn der Prozess 1 den Prozess 2 als Kindprozess startet (was im obigen Code kommentiert ist) - der SetEvent-Aufruf schlägt fehl. Was ist der Grund und die Lösung für dieses Problem?

3voto

Steve Townsend Punkte 52288

Ihr Code muss Fehler prüfen und behandeln. Beide CreateEvent y OpenEvent wird zurückgegeben NULL Wenn sie fehlschlagen, müssen Sie in diesem Fall den Fehler mit GetLastError .

Ihre Anrufe bei WaitForSingleObject y SetEvent sollte ebenfalls gemäß den MSDN-Dokumenten überprüft werden.

Die Reihenfolge, in der Sie die Dinge im Elternprozess erledigen müssen, ist die folgende:

  • CreateEvent
  • Untergeordneten Prozess starten
  • WaitForSingleObject.

Andernfalls werden Sie auf das von @Mark Tolonen genannte Problem stoßen.

Es wäre auch am besten, eine Zeitüberschreitung für das Warten vorzusehen, um den Fall zu behandeln, dass der Kindprozess nicht startet, unerwartet beendet wird oder sich aufhängt.

Ein alternativer Ansatz, wenn Sie diese Eltern-Kind-Beziehung verwenden wollen, wäre die Vererbung des Ereignis-Handles zuzulassen. Dann muss das Ereignis nicht benannt werden, und niemand kann es bei einem DoS-Angriff auf Ihre Anwendungen "besetzen". Sie können den Handle-Wert als Befehlszeilenparameter an das Child übergeben. Sie tun dies mit der bInheritHandle Feld auf der eventAttributes Parameter zu CreateEvent .

Ein boolescher Wert, der angibt, ob das zurückgegebene Handle vererbt wird, wenn ein neuer Prozess erstellt wird. Wenn dieser Element TRUE ist, erbt der neue Prozess das Handle geerbt.

2voto

Mark Tolonen Punkte 146757

Sind Sie sicher? Wie geschrieben, wird Prozess1, wenn er Prozess2 an der aktuellen Stelle erstellt, niemals Prozess2 erstellen, da er ewig auf das Auslösen des Ereignisses warten wird. Erstellen Sie zuerst Prozess2 und warten Sie dann, bis das Ereignis gesetzt wird.

2voto

Nicholas Gunder Punkte 21

Sie haben einen NULL-Sicherheitsdeskriptor, der laut Dokumentation nicht zulässt, dass das Handle an untergeordnete Prozesse vererbt wird:

If this parameter is NULL, the handle cannot be inherited by child processes

Vielleicht müssen Sie einen geeigneten Sicherheitsdeskriptor erstellen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X