Herencia de identificadores de canalización

El servidor de canalización controla si sus identificadores se pueden heredar de las siguientes maneras:

  • La función CreatePipe recibe una estructura SECURITY_ATTRIBUTES . Si el servidor de canalización establece el miembro bInheritHandle de esta estructura en TRUE, se pueden heredar los identificadores creados por CreatePipe .
  • El servidor de canalización puede usar la función DuplicateHandle para cambiar la herencia de un identificador de canalización. El servidor de canalización puede crear un duplicado noheritable de un identificador de canalización heredable o un duplicado heredable de un identificador de canalización no heredable.
  • La función CreateProcess permite al servidor de canalización especificar si un proceso secundario hereda todos o ninguno de sus identificadores heredables.

Cuando un proceso secundario hereda un identificador de canalización, el sistema permite que el proceso tenga acceso a la canalización. Sin embargo, el proceso primario debe comunicar el valor de identificador al proceso secundario. Normalmente, el proceso primario lo hace redirigiendo el identificador de salida estándar al proceso secundario, como se muestra en los pasos siguientes:

  1. Llame a la función GetStdHandle para obtener el identificador de salida estándar actual; guarde este identificador para que pueda restaurar el identificador de salida estándar original después de crear el proceso secundario.
  2. Llame a la función SetStdHandle para establecer el identificador de salida estándar en el identificador de escritura en la canalización. Ahora el proceso primario puede crear el proceso secundario.
  3. Llame a la función CloseHandle para cerrar el identificador de escritura en la canalización. Una vez que el proceso secundario hereda el identificador de escritura, el proceso primario ya no necesita su copia.
  4. Llame a SetStdHandle para restaurar el identificador de salida estándar original.

El proceso secundario usa la función GetStdHandle para obtener su identificador de salida estándar, que ahora es un identificador para el final de escritura de una canalización. A continuación, el proceso secundario usa la función WriteFile para enviar su salida a la canalización. Cuando el elemento secundario haya terminado con la canalización, debe cerrar el identificador de canalización llamando a CloseHandle o finalizando, lo que cierra automáticamente el identificador.

El proceso primario usa la función ReadFile para recibir la entrada de la canalización. Los datos se escriben en una canalización anónima como una secuencia de bytes. Esto significa que el proceso primario que lee desde una canalización no puede distinguir entre los bytes escritos en operaciones de escritura independientes, a menos que los procesos primarios y secundarios usen un protocolo para indicar dónde finaliza la operación de escritura. Cuando se cierran todos los identificadores de escritura en la canalización, la función ReadFile devuelve cero. Es importante que el proceso primario cierre su identificador al final de escritura de la canalización antes de llamar a ReadFile. Si no se hace esto, la operación ReadFile no puede devolver cero porque el proceso primario tiene un identificador abierto al final de escritura de la canalización.

El procedimiento para redirigir el identificador de entrada estándar es similar al de redireccionamiento del identificador de salida estándar, salvo que el identificador de lectura de la canalización se usa como identificador de entrada estándar del elemento secundario. En este caso, el proceso primario debe asegurarse de que el proceso secundario no hereda el identificador de escritura de la canalización. Si esto no se hace, la operación ReadFile realizada por el proceso secundario no puede devolver cero porque el proceso secundario tiene un identificador abierto al final de escritura de la canalización.

Para obtener un programa de ejemplo que usa canalizaciones anónimas para redirigir los identificadores estándar de un proceso secundario, consulte Creación de un proceso secundario con entrada y salida redirigidas.