Otro contenido relacionado con la muerte zombie
Cómo generar un proceso zombie:
Cuando un proceso llama al comando exit para finalizar su vida, en realidad no se destruye, sino que deja atrás una estructura de datos llamada Zombie (La función La función de salir de la llamada al sistema es hacer que el proceso salga, pero se limita a convertir un proceso normal en un proceso zombie y no puede destruirlo por completo). Entre los estados de los procesos de Linux, el proceso zombie es un tipo muy especial. Ha cedido casi todo el espacio de memoria, no tiene código ejecutable y no se puede programar. Solo puede reservar un lugar en la lista de procesos y registrar el estado de salida. del proceso, etc. La información es recopilada por otros procesos y los procesos zombies ya no ocupan espacio en la memoria. Requiere que su proceso padre recopile el cuerpo. Si su proceso padre no instala la función de señal SIGCHLD llamada wait o waitpid() para esperar el final del proceso hijo, y no ignora explícitamente la señal, entonces permanece. En el estado zombie, si el proceso principal finaliza, el proceso de inicio se hará cargo automáticamente del proceso secundario y recopilará el cuerpo. Aún se puede eliminar. Pero si el proceso principal es un bucle y no finaliza, entonces el proceso secundario permanecerá en un estado zombie. Es por eso que a veces hay una gran cantidad de procesos zombies en el sistema. 1. Vuelva a escribir el proceso principal para recopilar el cuerpo del proceso secundario después de que muera. El método específico consiste en hacerse cargo de la señal SIGCHLD. Después de que el proceso hijo muere, la señal SIGCHLD se envía al proceso padre. Después de que el proceso padre recibe esta señal, ejecuta la función waitpid () para recopilar el cadáver del proceso hijo. El principio de esto es que incluso si el proceso principal no llama a esperar, el kernel le enviará un mensaje SIGCHLD, pero el manejo predeterminado es ignorarlo. Si desea responder a este mensaje, puede configurar una función de controlador.
2. Mata el proceso padre. Después de que el proceso principal muera, el proceso zombie se convertirá en un proceso huérfano y pasará al proceso número 1 init, que siempre será responsable de limpiar el proceso zombie. Todos los procesos zombies que generó también desaparecerán.
En Linux, use
ps auwx
a all w/ tty, incluidas todas las ventanas y terminales de otros usuarios, incluidos los procesos de otros usuarios
u orientado al usuario (orientado al usuario)
-w, w salida ancha salida de formato ancho
x no controla el proceso ttys
En zombies Habrá una etiqueta después del proceso
ps axf
Ver el árbol de procesos y enumerar los procesos reales en el árbol
ps axm
Lista de subprocesos. Los procesos y subprocesos están unificados en Linux. Hay dos métodos de procesos livianos.
ps axu
Muestra el estado detallado del proceso
killall
kill -15
kill -9
No matar procesos desactivados
Después de usar Kill -15, Kill -9, se crearán más zombies.
kill -kill pid
fuser-k pid
Considere matar su proceso padre,
matar -9 su proceso padre
p>
============================ =============
Si un proceso ha finalizado pero su proceso principal no ha tomado ninguna medida (obtener información sobre el proceso secundario finalizado, liberar los recursos que aún ocupa), se denomina proceso zombie.
Cómo evitar zombies:
1) En SVR4, si se llama a signal o sigset con la configuración de SIGCHLD configurada para ignorar, no se crearán procesos zombies. Alternativamente, puede usar la versión SVR4 de sigaction para configurar el indicador SA_NOCLDWAIT para evitar procesos secundarios inactivos.
En Linux, esta función también se puede llamar al comienzo del programa
signal(SIGCHLD,SIG_IGN);
2) Llamar a fork dos veces. Los programas 8 - 5 logran esto.
3) Espere a que el proceso hijo regrese waitpid.
Un proceso zombie es un proceso muerto. Una forma de evitar procesos zombies es utilizar funciones como esperar y esperarpid para obtener el estado de terminación del proceso para liberar recursos. Otro método es bifurcarlo dos veces
El proceso detenido solo tiene un registro más en la tabla de procesos y no ocupará otros recursos a menos que su sistema casi exceda la cantidad de procesos restringidos y los procesos zombies no causarán. daño mayor.
Esta puede ser la única forma de reiniciar el sistema para eliminar procesos zombies.
Cualquier programa tiene un estado zombie, que ocupará algunos recursos de memoria (es decir, todavía hay registros en la tabla de procesos. Esto es solo un síntoma, no tengas miedo). Si hay un problema con el programa y aún tienes la posibilidad de encontrarlo, la forma sencilla y eficaz de resolver una gran cantidad de zombies es reiniciar. matar no tiene ningún efecto
fork y zombie/defunct
Hay múltiples procesos ejecutándose en Unix. Cuando un proceso muere, no desaparece por completo. El proceso finaliza y ya no se ejecuta, pero se dejan algunas cosas pequeñas para que el proceso principal las recupere. Estos residuos incluyen el valor de retorno del proceso hijo y algunas otras cosas. Cuando un proceso padre bifurca() un proceso hijo, debe esperar() o esperarpid() el proceso hijo antes de poder salir. Es esta operación de espera () la que hace que desaparezcan los restos del proceso hijo.
Por supuesto, hay excepciones a esta regla: el proceso padre puede ignorar el software SIGCLD sin esperar(). Puede hacer esto (en sistemas que admiten esta función, como Linux):
main()
{
signal(SIGCLD, SIG_IGN); * ¡Ahora no tengo que esperar()! */
.
.
fork();
fork();
fork() ; /* ¡Conejo, conejo, conejo! */
}
Cuando el proceso hijo muere, la espera () del proceso padre generalmente se muestra como "" en ps. Permanecerá en este estado para siempre hasta que el proceso principal espere() o maneje de la siguiente manera.
Otra regla a conocer es: cuando el proceso padre muere antes de esperar() al hijo (asumiendo que no ignora SIGCLD), el hijo tendrá el proceso init(pid 1) como padre. Esto no es un problema si el proceso hijo funciona correctamente y puede controlarse. Pero si el proceso hijo ha expirado, el proceso padre original ya no puede esperar() porque está muerto. Entonces, ¿cómo sabe init que debe esperar() estos procesos zombies?
Respuesta: En algunos sistemas, init destruirá periódicamente todos los procesos detenidos. En otros sistemas, init se niega a ser el padre de cualquier proceso desactivado y los destruye inmediatamente. Si está en uno de estos sistemas, puede escribir un bucle simple que complete la tabla de procesos con procesos desactivados que pertenecen a init.
Tarea: Asegurarse de que el proceso padre no ignore SIGCLD y no espere() todos los procesos que bifurca(). Sin embargo, puede que no siempre sea necesario hacer esto (por ejemplo, iniciar un demonio o algo así), pero debe programarse cuidadosamente. En las historias de fantasmas, los zombis suelen estar envueltos en telas blancas y acostados en ataúdes o morgues. Algunos cuerpos están intactos, mientras que otros están fragmentados o incluso podridos. Sus cuerpos están rígidos, de movimiento lento e inconscientes. , y casi no hay formas de abordarlos.