传承

【勇芳软件工作室】汉化HomePreviousNext

子进程可以从其父进程继承几个属性和资源。您还可以防止子进程从其父进程继承属性。以下可以继承:

*打开由CreateFile函数返回的句柄。这包括文件,控制台输入缓冲区,控制台屏幕缓冲区,命名管道,串行通信设备和邮槽的句柄。

*打开处理进程,线程,互斥体,事件,信号量,命名管道,匿名管道和文件映射对象的句柄。

*环境变量。

*当前目录。

*控制台,除非进程分离或创建新的控制台。子控制台进程还继承父级的标准句柄,以及对输入缓冲区和活动屏幕缓冲区的访问。

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

*优先课。

* LocalAllocGlobalAllocHeapCreateHeapAlloc返回的句柄。

*伪句柄,如GetCurrentProcessGetCurrentThread 功能返回的句柄所示。这些句柄只对调用进程有效。

*由LoadLibrary 函数返回的DLL模块句柄。

* GDI或USER句柄,如HBITMAPHMENU.

继承手柄

要使一个句柄被继承,你必须做两件事情:

*指定当您创建,打开或复制句柄时该句柄将被继承。

*当您调用CreateProcess函数时,指定要继承的可继承句柄。

这允许子进程继承其父进程的一些句柄,但不能继承其他进程。例如,CreateProcessCreateFile之类的创建函数使用一个安全属性参数来确定句柄是否可以被继承。开放的函数,如OpenMutexOpenEvent采取一个句柄继承标志来确定句柄是否可以被继承。DuplicateHandle函数使用句柄继承标志来确定句柄是否可以被继承。

当子进程创建时,CreateProcessfInheritHandles参数确定父进程的可继承句柄是否由子进程继承。继承的句柄引用子进程中与父进程中相同的对象。它也具有相同的价值和访问权限。因此,当一个进程更改对象的状态时,更改会影响两个进程。要使用句柄,子进程必须检索句柄值并“知道”它所引用的对象。通常,父进程通过其命令行,环境块或某种形式进程间通信将此信息传递给子进程。

如果某个进程具有您不希望由子进程继承的可继承的打开句柄,那么DuplicateHandle函数很有用。在这种情况下,使用DuplicateHandle打开不能继承的句柄的副本,然后使用CloseHandle函数来关闭可继承的句柄。您还可以使用DuplicateHandle函数打开不能继承的句柄的可继承副本。

继承环境变量

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

继承当前目录

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