Pregunta

Obtuve el PID de un proceso y necesito comprobar si es un zombi que usa las llamadas al sistema POSIX en C. ¿Cómo debo hacer eso?

El problema que tengo es que tengo un proceso y se divide en muchos niños, todos los niños hacen ejecutivos y, a veces, quiero hacer el ejecutivo en segundo plano, así que realmente no puedo esperar () a los niños que van en el fondo. Podría esperar () periódicamente (una vez en mi bucle principal) pero necesito saber qué procesos son zombies para que el proceso de mi padre no se cuelgue mientras espero a los niños que no terminarán pronto.

Si tienes curiosidad, estoy construyendo un shell de Unix y está en la naturaleza de la cáscara tener procesos hijos que se comportan de forma asíncrona.

¿Fue útil?

Solución

No puedes verificar si un proceso es un zombie con llamadas POSIX puras, excepto cuando eres el proceso padre, y cosecharlo con un wait family call. Así que tendrás que encontrar un buen lugar para esperar al niño.

Una opción es configurar un controlador SIGCHLD y hacer un waitpid (0, & amp; status, WNOHANG) allí. Asegúrese de hacer un bucle hasta que ya no encuentre ningún proceso: si dos niños mueren en un corto intervalo, solo puede obtener un SIGCHLD .

Otra opción es doblar la horquilla, es decir, fork () , hacer que el hijo (llámelo hijo A) de nuevo, tener el segundo hijo (hijo B) exec. Entonces el niño A sale inmediatamente. Mientras tanto, el padre está wait () para el niño A. Una vez que el niño A se haya ido, el proceso de inicio del sistema se encargará de recoger al niño B cuando finalmente muera. Este método es más simple, pero su shell no tendrá forma de saber cuándo muere el hijo B, por lo que si necesita esa información, use el método anterior.

Otros consejos

Pero ... pero ... el zombi es un niño (en algún nivel) y el proceso que está verificando es un padre, ¿verdad? Entonces, si le preocupa que un pid específico sea un zombi, ¿por qué no simplemente hace un waitpid (2) con WNOHANG y se deshace de él? Ahora, esto consumirá el estado de salida, por lo que puede ser una mala idea si algún otro proceso querrá realmente esperar en el futuro.

Mencionas que estás construyendo un shell de Unix; debe leer esto: Manejo adecuado de SIGINT / SIGQUIT

Normalmente, el shell comprueba si hay hijos difuntos poco antes de imprimir su solicitud, utilizando la llamada al sistema waitpid (2) y la opción WNOHANG como ya se mencionó. Es posible que también desee un controlador SIGCHLD, pero tendría que decidir qué va a hacer con la información si está ocupado esperando que termine algún proceso en primer plano y, en realidad, es un proceso en segundo plano que termina.

Esta es solo una pequeña variación en la respuesta seleccionada actualmente.

¿Y qué pasa con el comando de shell 'ps' que muestra la tabla de procesos activos donde se puede encontrar que un proceso está 'inactivo'? Supongo que debe haber una manera de obtener esa información desde el código c.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top