Frage

Es gibt einige Win32-Objekte, die nach dem SDK können durch die gegebenen Verfahren geschaffen, um die Kind-Prozesse „geerbt“ werden. (Veranstaltungen, Mutexe, Rohre, ...)

Was bedeutet das eigentlich bedeuten?

Lassen Sie uns sagen, ich habe ein benanntes Ereignisobjekt, mit CreateEvent erstellt, einmal mit bInheritHandle == true, und ein anderes Mal == false.

Jetzt beginne ich ein Kind Prozess. Wie funktioniert diese beiden Ereignisse behandelt, das Kind Prozess beeinflussen? In welchen Szenarien unterscheiden sie sich?

War es hilfreich?

Lösung

Wenn Sie erstellen / öffnen ein Objekt und ermöglichen, dass Griff vererbt werden, untergeordnete Prozesse, die zu vererben Griffe sind erlaubt (zum Beispiel Sie bInheritHandles = TRUE für Createprocess angeben) Kopien dieser Griffe haben. Diese geerbte Griffe werden die gleichen Griff Werte wie die Eltern Griffe haben. So zum Beispiel:

  • CreateEvent gibt einen Handle auf ein Event-Objekt, Griff 0x1234.
  • Sie erlauben, dass Griff vererbt werden.
  • Sie erstellen ein Kind-Prozess, dass erbt Ihre Griffe.
  • Das Kind Prozess kann jetzt Griff 0x1234 verwenden, ohne CreateEvent oder OpenEvent anrufen zu müssen. Sie könnten den Griff Wert in der Befehlszeile des Kindes Prozess zum Beispiel passieren.

Dies ist nützlich für unbenannte Objekte - da sind sie nicht namentlich, andere Prozesse, sie nicht öffnen können. Mit Griff Vererbung Kindprozesse können Griffe auf unbenannte Objekte erhalten, wenn Sie wollen, dass sie.

Andere Tipps

Ein Punkt, der nicht in den bestehenden Antworten gemacht hat, ist, dass ein Kind Prozess ermöglicht zu vererben Griffen nicht nur das Kind Prozess beeinflussen; es kann auch die Lebensdauer des Objekts, auf das Auswirkungen auf die Griffe beziehen. Wenn der übergeordneten Prozess beendet wird, werden die Griffe in dem untergeordneten Prozess halten das Objekt am Leben.

Wenn ermöglicht einen untergeordneten Prozess zu vererben Griffe müssen Sie prüfen, ob es in einem Objekt führen leben länger als es sein sollte; zum Beispiel wollen einige Anwendungen nur einer Instanz zu laufen zu einem Zeitpunkt ermöglichen, und könnten das tun, indem Sie ein Event-Objekt mit einem bestimmten Namen zu schaffen und zu sehen, ob es bereits vorhanden ist. Wenn sie ein Kind Prozess, der erbt das Ereignisobjekt erstellen, und überlebt die Eltern, sie in einem falsch positiven Ergebnis könnten.

Häufiger eine vererbte Handle auf eine Datei in der Datei in Gebrauch verbleibenden führen kann (und somit nicht zugänglich) länger als es haben sollte.

Aus diesem Grund empfiehlt sich, zu:

  • Machen Sie alle Griffe als nicht vererbbar, sofern sie nicht ausdrücklich geerbt werden müssen.

  • Wenn ein Teilprozess nicht zu vererben Griffe müssen nicht passieren FALSE für bInheritHandles.

  • Wenn ein Teilprozess braucht zu vererben Griffen, nur erlaubt es diese spezifischen Griffe zu erben, die benötigt werden .

Auf der anderen Seite kann diese gelegentlich nützlich sein; wenn Sie zum Beispiel will das Kind Prozess als eine Instanz des übergeordneten Prozesses zu zählen, oder für eine Datei unzugänglich bleiben, bis das Kind verlassen hat. Ein weiterer Trick ist, ein Kind vererben einen Griff zu einem benannten Objekt zu haben, und dann verwenden, um die Existenz oder Nicht-Existenz des Objekts zu bestimmen, ob das Kind noch am Leben ist, ohne einen Prozess handelt oder Prozess-ID zu übergeben um.

Wenn Sie eine Veranstaltung erstellen, und lassen Sie den Griff von Child-Prozessen geerbt werden, dann wird der Kind-Prozess den Griff in die exakt gleiche Objekt verwenden, können von den Eltern erstellt. Dies kann in einer Weise verwendet werden, in denen ein Kind verwendet ein Ereignis Handle auf das übergeordnete Signal, wenn eine Aufgabe abgeschlossen ist (es gibt viele andere Verwendungen für vererbbare Ereignis Objekt-Handles).

EDIT: Entfernte Desinformation.

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