2012-03-06 14 views

Respuesta

2

Porque en UNIX una de las características más utilizadas es/was secuencias de canalización entre procesos, y no se puede hacer si se establece el indicador CLOEXEC (proceso hijo no puede heredar descriptor (es) de archivo, por ej .: STDOUT_FILENO).

Y no, no es cierto que no pueda usar descriptores de archivos heredados después de exec (ejemplo: streams estándar). También puede usar cualquier descriptor de archivo heredado siempre que sepa su valor (es un número entero). Este valor a menudo se pasa a un proceso secundario por argumento (bastantes programas UNIX lo hacen), o puede hacerlo de cualquier otra manera utilizando cualquier mecanismo de IPC (comunicación entre procesos) de su elección.

3

Descriptores de archivo puede se puede utilizar después de una llamada exec; así es como las utilidades de Unix obtienen sus fds de entrada/salida/error estándar del shell, por ejemplo.

Primer on-exec no es el valor por defecto porque el POSIX standard (y la tradición Unix) mandatos el comportamiento opuesto:

descriptores de archivos abiertos imagen del proceso de llamada en quedará abierta la imagen del nuevo proceso en, excepto para aquellos cuyo close-on-flag FD_CLOEXEC se establece.

+0

¿Hay algún otro caso de uso además de los fds de entrada/salida/error? –

+0

bifurcación no es ejecutivo, sin embargo. –

+0

Oops, pedo cerebro. Bien, hay soporte para la redirección fd arbitraria en las conchas modernas, que deben haberse introducido con una razón; aunque nunca me pareció útil. –

0

No me importaría obtener una respuesta más completa a esto, pero es bastante fácil adivinar que es por compatibilidad con versiones anteriores. la bandera de close-on-exec tuvo que ser introducida alguna vez. El código existente antes de esa fecha no lo conocía y no funcionaría correctamente, a menos que se haya cambiado. Por lo tanto, está apagado por defecto.

Lamentablemente, se producen errores debido a esto, un proceso demoníaco que bifurca un cgi puede dejar el socket de escucha abierto, y si el cgi no se cierra o cierra, no se puede reiniciar el daemon. Así que estoy de acuerdo contigo en que no es realmente un buen incumplimiento.

Cuestiones relacionadas