继承

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

  • 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 函数。