根据SDK,有些Win32对象可以“继承”到给定进程创建的子进程。 (事件,互斥体,管道等)

这实际上是什么意思?

假设我有一个命名事件对象,该对象使用CreateEvent创建,一次使用bInheritHandle == true创建,另一次使用== false创建。

现在,我开始一个子进程。这两个事件句柄如何影响子进程?它们在哪些情况下有所不同?

最佳答案

如果您创建/打开一个对象并允许该句柄被继承,则允许继承该句柄的子进程(例如,您可以为CreateProcess指定bInheritHandles = TRUE)将具有这些句柄的副本。这些继承的句柄将具有与父句柄相同的句柄值。因此,例如:

  • CreateEvent返回事件对象的句柄,该句柄是0x1234
  • 您允许该句柄被继承。
  • 您将创建一个继承您的句柄的子进程。
  • 该子进程现在可以使用句柄0x1234,而不必调用CreateEventOpenEvent。例如,您可以在子进程的命令行中传递句柄值。

  • 这对未命名的对象很有用-由于未命名对象,其他进程无法打开它们。如果需要,使用句柄继承子进程可以获取未命名对象的句柄。

    09-12 17:31