WinAPI:谁关闭了继承的句柄?
WinAPI: who closes an inherited handle?
在 windows 中,子进程可以 inherit handles 父进程,前提是句柄是可继承的,并且子进程是使用“继承句柄”选项创建的。
这些句柄是如何正确关闭的?我找不到任何相关文档。
父进程关闭(或终止)时,子进程中继承的句柄是否失效?在那种情况下,子进程将不得不复制它。并且仅在使用后关闭副本 - 但是根据句柄值传递给子进程的方式,会有一个(微小的)window,其中句柄在复制之前可能会变得无效。
或者子进程是否有自己的句柄,它可以(并且应该)根据需要关闭?
这对我来说似乎更合理,但我想知道我们如何确保子进程知道它负责的所有句柄?
继承句柄这是重复的句柄。因此它们独立于 parent 进程句柄,并且在 parent 进程关闭自我复制时不会失效。并且 child 进程可以(并且应该)在不再需要时关闭此句柄。如果不这样做 - 进程退出时将关闭句柄。
how can we ensure that the child process knows of all handles it
became responsible for?
正式可能枚举自身进程中的所有句柄(通过 NtQuerySystemInformation(SystemExtendedHandleInformation)
和每个句柄调用 GetHandleInformation
并检查 HANDLE_FLAG_INHERIT
。但这没有多大意义,没有人这样做。
需要先问另一个问题 - 我们将句柄传递给 child 的是什么?在大多数情况下,我们还将有关此句柄值的信息传递给 child。通常在命令行中。 child 必须了解命令行格式并获取有关句柄的信息。
child 将如何使用句柄、关闭句柄或仅在 child 退出时才会关闭 - 这已经取决于 child 进程。怎么样 written/design
在 windows 中,子进程可以 inherit handles 父进程,前提是句柄是可继承的,并且子进程是使用“继承句柄”选项创建的。
这些句柄是如何正确关闭的?我找不到任何相关文档。
父进程关闭(或终止)时,子进程中继承的句柄是否失效?在那种情况下,子进程将不得不复制它。并且仅在使用后关闭副本 - 但是根据句柄值传递给子进程的方式,会有一个(微小的)window,其中句柄在复制之前可能会变得无效。
或者子进程是否有自己的句柄,它可以(并且应该)根据需要关闭?
这对我来说似乎更合理,但我想知道我们如何确保子进程知道它负责的所有句柄?
继承句柄这是重复的句柄。因此它们独立于 parent 进程句柄,并且在 parent 进程关闭自我复制时不会失效。并且 child 进程可以(并且应该)在不再需要时关闭此句柄。如果不这样做 - 进程退出时将关闭句柄。
how can we ensure that the child process knows of all handles it became responsible for?
正式可能枚举自身进程中的所有句柄(通过 NtQuerySystemInformation(SystemExtendedHandleInformation)
和每个句柄调用 GetHandleInformation
并检查 HANDLE_FLAG_INHERIT
。但这没有多大意义,没有人这样做。
需要先问另一个问题 - 我们将句柄传递给 child 的是什么?在大多数情况下,我们还将有关此句柄值的信息传递给 child。通常在命令行中。 child 必须了解命令行格式并获取有关句柄的信息。
child 将如何使用句柄、关闭句柄或仅在 child 退出时才会关闭 - 这已经取决于 child 进程。怎么样 written/design