继承
子进程可以从其父进程继承多个属性和资源。 还可以阻止子进程从其父进程继承属性。 可以继承以下内容:
- CreateFile 函数返回的打开句柄。 这包括文件的句柄、控制台输入缓冲区、控制台屏幕缓冲区、命名管道、串行通信设备和 mailslot。
- 打开句柄以处理、线程、互斥、事件、信号灯、命名管道、匿名管道和文件映射对象。 这些函数分别由 CreateProcess、 CreateThread、 CreateMutex、 CreateEvent、 CreateSemaphore、 CreateNamedPipe、 CreatePipe 和 CreateFileMapping 函数返回。
- 环境变量。
- 当前目录。
- 控制台,除非分离进程或创建新主机。 子控制台进程还可以继承父级的标准句柄,以及对输入缓冲区和活动屏幕缓冲区的访问权限。
- 由 SetErrorMode 函数设置的错误模式。
- 处理器关联掩码。
- 与作业的关联。
子进程不继承以下内容:
- 优先级类。
- LocalAlloc、GlobalAlloc、HeapCreate 和 HeapAlloc 返回的句柄。
- 伪句柄,如 GetCurrentProcess 或 GetCurrentThread 函数返回的句柄中一样。 这些句柄仅对调用进程有效。
- LoadLibrary 函数返回的 DLL 模块句柄。
- GDI 或 USER 句柄,例如 HBITMAP 或 HMENU。
继承句柄
子进程可以继承其父级的某些句柄,但不能继承其他句柄。 若要使句柄被继承,必须执行两项操作:
- 指定在创建、打开或复制句柄时继承句柄。 为此,创建函数通常使用 SECURITY_ATTRIBUTES 结构的 bInheritHandle 成员。 DuplicateHandle 使用 bInheritHandles 参数。
- 通过在调用 CreateProcess 函数时将 bInheritHandles 参数设置为 TRUE 来指定要继承的句柄。 此外,若要继承标准输入、标准输出和标准错误句柄,STARTUPINFO 结构的 dwFlags 成员必须包含STARTF_USESTDHANDLES。
若要指定应由特定子进程继承的句柄列表,请使用 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 标志调用 UpdateProcThreadAttribute 函数。
继承的句柄引用子进程中与在父进程中相同的对象。 它还具有相同的值和访问权限。 因此,当一个进程更改对象的状态时,更改会影响这两个进程。 若要使用句柄,子进程必须检索句柄值并“知道”它引用的对象。 通常,父进程通过其命令行、环境块或某种形式的 进程间通信将此信息传达给子进程。
使用 SetHandleInformation 函数控制现有句柄是否可继承。
继承环境变量
默认情况下,子进程继承其父进程的环境变量。 但是, CreateProcess 允许父进程指定不同的环境变量块。 有关详细信息,请参阅 环境变量。
继承当前目录
GetCurrentDirectory 函数检索调用进程的当前目录。 默认情况下,子进程继承其父进程的当前目录。 但是, CreateProcess 允许父进程为子进程指定不同的当前目录。 若要更改调用进程的当前目录,请使用 SetCurrentDirectory 函数。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈