Considere dos procesos, A y B, con flujos de entrada y salida estándar conectados entre sí a través de tuberías para formar un circuito cerrado. Suponga que, como resultado de un exec, los dos procesos no conocen directamente su relación entre ellos.

Si B termina abruptamente (por ejemplo, enviándole un SIGKILL), ¿cómo puede A saber que B murió? O al menos, haz que A muera también

Vista rápida de la situación, donde Cmd es Cliente A y B: ingrese la descripción de la imagen aquí

0
Neok 14 dic. 2016 a las 16:41

2 respuestas

La mejor respuesta

Según tengo entendido, lo único con lo que tienes que trabajar son las tuberías. Nada más que pueda ayudarlo a comunicarse con un ejecutivo, especialmente si suponemos que el programa que se ejecuta en el proceso A no está diseñado específicamente para esta interacción. Por tanto, consideremos lo que puede hacer con las tuberías.

Cuando B termina, por cualquier motivo, todos los identificadores de archivos abiertos se cierran. Eso incluye sus asas en los extremos de la tubería.

Si A posteriormente intenta escribir en su propio stdout, y el extremo de lectura no está abierto en ningún proceso, * entonces A recibirá un {{X1} }, como observó @indianant. La disposición predeterminada para esa señal es terminar el proceso, por lo que A también morirá a menos que haya cambiado la disposición de esa señal. Si A cambia la disposición de SIGPIPE está fuera de su control, a menos que el programa que se ejecuta en A sea uno que haya proporcionado.

Pero quizás A se bloqueará la lectura de su entrada estándar cuando B finalice. Suponiendo que B fuera el único proceso que mantiene abierto el extremo de escritura de esa tubería, A verá EOF en su entrada estándar. Esto no hará que A finalice automáticamente, pero puede responder de forma adecuada a ese evento, lo que podría provocar que finalice de forma natural. Además, A puede recibir primero datos escritos por B antes de su finalización; si A responde intentando escribir en su salida estándar, se aplica el párrafo anterior.

Sin embargo, nada de eso se aplica, a menos que A esté realizando E / S en sus transmisiones estándar. Si está buscando algún tipo de notificación asincrónica, probablemente deba hacer que sea responsabilidad de un tercer proceso. Sería más fácil para ese propósito darle a A y B un proceso principal común, posiblemente uno dedicado al propósito. El padre será notificado a través de un SIGCHLD o regresando de un wait() o waitpid() cuando uno de sus hijos muera; Entonces podría tomar las medidas adecuadas, como matar al otro niño. Tenga en cuenta que esto no funciona si A es el padre de B o vise versa, porque los controladores de señales no se transfieren a un ejecutivo, excepto posiblemente {{X4 }} para SIGCHLD.

* En particular, asegúrese de que el extremo de lectura no esté abierto en A cerrándolo antes del exec.

1
John Bollinger 14 dic. 2016 a las 15:56

"A" recibe la señal SIGPIPE cuando escribe en la tubería donde se mata al consumidor.

Puede registrar el controlador para SIGPIPE y manejarlo con elegancia.

1
indianant 14 dic. 2016 a las 14:26