遗产

子进程可以从其父进程继承多个属性和资源。 还可以阻止子进程从其父进程继承属性。 可以继承以下内容:

  • 打开由 CreateFile 函数返回的句柄。 这包括文件句柄、控制台输入缓冲区、控制台屏幕缓冲区、命名管道、串行通信设备和 mailslots。
  • 打开处理句柄、线程、互斥体、事件、信号灯、命名管道、匿名管道和文件映射对象。 这些 CreateProcessCreateThreadCreateMutexCreateEventcreateSemaphoreCreateNamedPipeCreatePipe,以及分别 CreateFileMapping 函数。
  • 环境变量。
  • 当前目录。
  • 除非分离进程或创建新控制台,否则控制台。 子控制台进程还可以继承父级的标准句柄,以及对输入缓冲区和活动屏幕缓冲区的访问。
  • 错误模式,由 SetErrorMode 函数设置。
  • 处理器关联掩码。
  • 与作业的关联。

子进程不会继承以下内容:

继承句柄

子进程可以继承其父级的某些句柄,但不能继承其他句柄。 若要使句柄继承,必须执行以下两项作:

  • 指定在创建、打开或复制句柄时要继承句柄。 创建函数通常使用此 SECURITY_ATTRIBUTES 结构的 bInheritHandle 成员。 DuplicateHandle 使用 bInheritHandles 参数。
  • 指定通过在调用 CreateProcess 函数时将 bInheritHandles 参数设置为 TRUE 来继承可继承的句柄。 此外,若要继承标准输入、标准输出和标准错误句柄,dwFlagsSTARTUPINFO 结构的成员必须包括STARTF_USESTDHANDLES。

若要指定应由特定子进程继承的句柄列表,请使用 PROC_THREAD_ATTRIBUTE_HANDLE_LIST 标志调用 UpdateProcThreadAttribute 函数。

继承的句柄引用子进程中的同一对象,就像在父进程中一样。 它还具有相同的值和访问权限。 因此,当一个进程更改对象的状态时,更改会影响这两个进程。 若要使用句柄,子进程必须检索句柄值并“知道”它引用的对象。 通常,父进程通过其命令行、环境块或某种形式的 进程间通信将此信息传达给子进程。

使用 SetHandleInformation 函数控制现有句柄是否可继承。

继承环境变量

默认情况下,子进程继承其父进程的环境变量。 但是,CreateProcess 使父进程能够指定不同的环境变量块。 有关详细信息,请参阅 环境变量

继承当前目录

GetCurrentDirectory 函数检索调用进程的当前目录。 默认情况下,子进程继承其父进程的当前目录。 但是,CreateProcess 使父进程能够为子进程指定不同的当前目录。 若要更改调用进程的当前目录,请使用 SetCurrentDirectory 函数。