Frage

Wenn ein Kind Prozess in C ++ Erstellen von Windows-API verwenden, ein Erbe der Griffe von Eltern auf das Kind erlauben kann. In einem Microsoft Beispiel "Erstellen eines Child-Prozess mit umgeleiteten Ein- und Output ", Umleitung ein Kind Prozess std in / out an Rohren durch die Eltern erstellt, ist es notwendig, die Vererbung für die Umleitung Leitungen zu ermöglichen, verwendbar zu sein.

Ich arbeite an einer kleinen Demo-Klasse, die startet eine externe ausführbare Datei, die Ausgabe liest, und dann spuckt sie zurück an den Anrufer (der die zurückgegebenen Ausgabe in eine Datei aufzeichnet). Ich bin in einer Time-out-Funktion zu bauen versucht, wo es nur für eine bestimmte Zeit blockiert werden, bevor TerminateProcess() auf das Kind rufen und weiterhin mit dem Leben.

Allerdings habe ich festgestellt, dass Griff Vererbung, indem das Kind Prozess hat auch einen Griff (sichtbar mit Process Explorer ) in die Ausgabedatei. Ich mag nicht das Kind Prozess diesen Griff zu bekommen, aber die Eltern in diesem Fall (diese Demo-Klasse) ist nicht bekannt, den Griff entweder, so dass ich nicht zur Zeit SetHandleInformation() kann die Ausgabedatei Kennzeichen entfernen speziell es ausschließt von Vererbung.

Ich bin sicher, es muss ein besserer Weg zu erben sein nur die spezifischen Griffe, dass ich will, ohne dass „Decke“ Erbe, die unbeabsichtigten und unerwünschte Griffe passiert. Leider kann ich nicht in der Lage gewesen, um eine Lösung zu finden, wie viele ähnlichen MSDN-Artikel durchsucht, wie ich finde, und mich in einen Zustand der Entmutigung gegoogelt zu haben.

Am allerwenigsten, muss ich tun etwas die Griffe von dem Kind zu entfernen, ohne notwendigerweise die Griffe in der Demo-Klasse mit (sie von der anrufenden Klasse gewohnt sind, und diese Demo Klasse hat keine explizite Kenntnis ihrer Existenz).

Jede Lösungen für selektivere Erbe? Ich bin vor allem in der Lösung interessiert, die mich speziell erlaubt, was Griffe zu vererben zu erklären, und alle nicht-spezifizierte Griffe werden nicht vererbt werden, wenn eine solche Lösung existiert.

Danke nett.

War es hilfreich?

Lösung

Wenn die Ausgabedatei Handle von den untergeordneten Prozess geerbt wird, dann ist das, weil der Code in den übergeordneten Prozess die Datei explizit erwähnt die geöffnet, dass die Datei-Handle vererbbar sein sollte. Es ging um einen Wert für den lpSecurityAttributes Parameter von CreateFile . Der Standardzustand ist für den Griff zu nicht sein vererbbar.

Es scheint mir, dass Ihr Prozess schöpf Klasse nicht zu zweiten erraten seine Anrufer versuchen sollte, die bereits die Datei geöffnet hat.

Wenn Sie jedoch spezielle Kenntnisse über genau haben, die die neuen Prozessanforderungen behandelt, dann wie von Windows Vista gibt es einen Mechanismus für die Angabe, welche Griffe vererbt werden soll. Wenn Sie zum Aufruf CreateProcess vorbereiten, eine STARTUPINFOEX Struktur verwenden statt des üblichen STARTUPINFO. Es verfügt über ein lpAttributeList Mitglied. Zuzuteilen und initialisieren, und dann verwenden UpdateProcThreadAttribute mit PROC_THREAD_ATTRIBUTE_HANDLE_LIST die Liste der Handles gesetzt werden vererbt. Alle die Griffe müssen vererbbar sein, und Sie müssen noch bInheritHandles = true angeben, wenn Sie CreateProcess nennen. Sie müssen auch EXTENDED_STARTUPINFO_PRESENT im dwCreationFlags Parameter enthalten. Raymond Chen demonstrierte die Technik in einem Artikel im Jahr 2011

Wenn das erweiterte Funktionalität nicht verfügbar ist, dann könnte man sicherlich versuchen, [enumerate alle offenen Handles des Programms] und stellen alle ihre Vererbungseigenschaften mit SetHandleInformation , aber das scheint über den Rahmen einer Funktion, deren Aufgabe es ist zu schaffen, untergeordnete Prozesse zu sein. Lassen Sie den Code, der die Griffe sorgen sich um erzeugt, ob sie vererbbar sein sollte.

Andere Tipps

Sie können mit SetHandleInformation klar die HANDLE_FLAG_INHERIT Bit auf Ihren Ausgang Griff, wird dies erben sie das Kind Prozess verhindern.

  

Wenn dieser Flag gesetzt ist, ein Kind-Prozess mit dem bInheritHandles Parameter von Create Satz auf TRUE erstellt das Objekt-Handle erben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top