继承

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

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

子进程不继承以下内容:

继承句柄

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

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

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

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

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

继承环境变量

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

继承当前目录

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