继承
子进程可以从其父进程继承多个属性和资源。 还可以阻止子进程从其父进程继承属性。 可以继承以下内容:
- 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 函数。