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 gráficos de correo.
- Identificadores abiertos para procesar, subproceso, exclusión mutua, evento, semáforo, canalización con nombre, canalización anónima y objetos de asignación de archivos. Las devuelven las funciones CreateProcess, CreateThread, CreateMutex, CreateEvent, CreateSemaphore, CreateNamedPipe, CreatePipe y CreateFileMapping , respectivamente.
- Variables de entorno.
- El 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.
- Modo de error, establecido por la función SetErrorMode .
- Máscara de afinidad de procesador.
- Asociación con un trabajo.
El proceso secundario no hereda lo siguiente:
- Clase priority.
- Identificadores devueltos por LocalAlloc, GlobalAlloc, HeapCreate y 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ón LoadLibrary .
- 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 miembro bInheritHandle de una estructura de SECURITY_ATTRIBUTES para este fin. DuplicateHandle usa el parámetro bInheritHandles .
- Especifique que los identificadores heredados 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 de la estructura STARTUPINFO debe incluir STARTF_USESTDHANDLES.
Para especificar una lista de los identificadores que un proceso secundario específico debe heredar, 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 del 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ón SetHandleInformation 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 que el proceso primario especifique un directorio actual diferente para el proceso secundario. Para cambiar el directorio actual del proceso de llamada, use la función SetCurrentDirectory .