Herencia
Un proceso secundario puede heredar varias propiedades y recursos de su proceso primario. También puede impedir que un proceso secundario herede las propiedades de su proceso primario. Se puede heredar lo siguiente:
- Identificadores abiertos devueltos por la función CreateFile. Esto incluye identificadores de archivos, búferes de entrada de consola, búferes de pantalla de consola, canalizaciones con nombre, dispositivos de comunicación serie y mailslots.
- Abra identificadores para procesar, subprocesos, exclusión mutua, evento, semáforo, canalización con nombre, canalización anónima y objetos de asignación de archivos. Las CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipey funciones de CreateFileMapping, respectivamente.
- Variables de entorno.
- Directorio actual.
- La consola, a menos que se desasocie el proceso o se cree una nueva consola. Un proceso de consola secundario también puede heredar los identificadores estándar del elemento primario, así como el acceso al búfer de entrada y al búfer de pantalla activo.
- El modo de error, tal como lo establece la funciónSetErrorMode.
- Máscara de afinidad del procesador.
- Asociación con un trabajo.
El proceso secundario no hereda lo siguiente:
- Clase priority.
- Identificadores devueltos por LocalAlloc, GlobalAlloc, HeapCreatey HeapAlloc.
- Pseudo handles, como en los identificadores devueltos por la función GetCurrentProcess o GetCurrentThread. Estos identificadores solo son válidos para el proceso de llamada.
- Identificadores de módulo DLL devueltos por la funciónLoadLibrary.
- Identificadores GDI o USER, como HBITMAP o HMENU.
Heredar identificadores
Un proceso secundario puede heredar algunos de sus identificadores primarios, pero no heredar otros. Para que se herede un identificador, debe hacer dos cosas:
- Especifique que el identificador se va a heredar al crear, abrir o duplicar el identificador. Las funciones de creación suelen usar el bInheritHandle miembro de una estructura de SECURITY_ATTRIBUTES para este propósito. DuplicateHandle usa el parámetro bInheritHandles.
- Especifique que los identificadores heredables se heredan estableciendo el parámetro bInheritHandles en TRUE al llamar a la función CreateProcess. Además, para heredar los identificadores de entrada estándar, salida estándar y error estándar, el miembro dwFlags del estructura de STARTUPINFO debe incluir STARTF_USESTDHANDLES.
Para especificar una lista de los identificadores que debe heredar un proceso secundario específico, llame a la función UpdateProcThreadAttribute con la marca PROC_THREAD_ATTRIBUTE_HANDLE_LIST.
Un identificador heredado hace referencia al mismo objeto del proceso secundario que en el proceso primario. También tiene el mismo valor y privilegios de acceso. Por lo tanto, cuando un proceso cambia el estado del objeto, el cambio afecta a ambos procesos. Para usar un identificador, el proceso secundario debe recuperar el valor de identificador y "conocer" el objeto al que hace referencia. Normalmente, el proceso primario comunica esta información al proceso secundario a través de su línea de comandos, bloque de entorno o alguna forma de comunicación entre procesos.
Use la funciónSetHandleInformation para controlar si un identificador existente se puede heredar o no.
Heredar variables de entorno
Un proceso secundario hereda las variables de entorno de su proceso primario de forma predeterminada. Sin embargo, CreateProcess permite al proceso primario especificar un bloque diferente de variables de entorno. Para obtener más información, consulte Variables de entorno.
Heredar el directorio actual
La función getCurrentDirectory recupera el directorio actual del proceso de llamada. Un proceso secundario hereda el directorio actual de su proceso primario de forma predeterminada. Sin embargo, CreateProcess permite al proceso primario especificar un directorio actual diferente para el proceso secundario. Para cambiar el directorio actual del proceso de llamada, use la funciónSetCurrentDirectory.