2011-07-16 13 views
10

Quiero crear muchos procesos secundarios utilizando el procedimiento fork> exec. Muchos procesos terminan muy rápido (en menos de dos minutos, algunos incluso antes).C: Exec/fork> Procesos difuntos

Mi primer problema es, puse el proceso de desove en el fondo con

./spawnbot > logging.txt 
[CTRL+Z] 
bg 1 
disown 

Hasta aquí todo bien. Ahora ya no veo ninguno de los mensajes del spawnbot y van directamente al logging.txt. Sin embargo, cada vez que se crea un nuevo hijo, vuelvo a ver toda la información sobre ese niño en mi consola. Ahora quería comenzar cada hijo con su propio conducto: ¿hay alguna manera mejor de que los niños no publiquen sus mensajes de salida en todo el mundo? ¿consola? ¿Debería redirigirlo a/dev/null o se hace esto con alguna bandera en C?

En segundo lugar, no todos los niños realmente mueren. Tengo muchos procesos en mi ps -ef. ¿Qué puedo hacer al respecto? ¿Cómo lo hago? D

Respuesta

13

¡Primero su segunda pregunta!

Sus niños permanecen en el modo 'zombi' debido a que el núcleo cree que es posible que aún desee recuperar un valor de retorno de ellos ..

Si usted no tiene intención de obtener valores de retorno de sus procesos secundarios, se debe configurar el controlador de señal SIGCHLD en el proceso principal a SIG_IGN para que el kernel recoja automáticamente sus hijos.

signal(SIGCHLD, SIG_IGN); 

Pero como regla general,

La primera pregunta depende en su aplicación .., justo después de tenedor() se debe utilizar close() para cerrar las viejas descriptores de fichero para 0 y 1 y luego usar dup2() para establecerlos en los valores deseados ... No hay tiempo para un ejemplo en este momento, pero espero que esto te empuje en la dirección correcta ...

13

Tus procesos secundarios están siendo eliminados. Defunct processes también se llaman zombie processes; los zombis están muertos! Un proceso zombie no es más que una entrada en la tabla de procesos, no tiene ningún código o memoria.

Cuando un proceso muere (llamando _exit, o muerto por una señal), que debe ser cosechado por su padre. Cada recurso utilizado por el proceso que no sea la entrada en la tabla de proceso desaparece. El padre debe llamar al wait o waitpid. Una vez que el padre ha sido notificado de la muerte del proceso hijo y ha tenido la oportunidad de leer el estado de salida del niño, la entrada del niño en la tabla de proceso también desaparece: el zombi es cosechado.

Si no quiere que se le notifique la muerte de sus hijos, ignore la señal SIGCHLD; esto le dice al núcleo que no estás interesado en saber el destino de tus hijos y que el zombi será cosechado automáticamente.

signal(SIGCHLD, SIG_IGN) 

Si sólo desea ser notificado de las muertes de sus hijos en circunstancias específicas, llame sigaction con la bandera SA_NOCLDWAIT. Cuando un niño muere, si el padre está ejecutando una de las funciones de la familia wait, se le notificará la muerte del niño y se le informará el estado de la salida; de lo contrario, se descartará el estado de salida del niño.

struct sigaction sa; 
sa.sa_handler = &my_sigchld_handler; 
sigemptyset(&sa.sa_mask); 
sa.sa_flags = SA_NOCLDWAIT; 
sigaction(SIGCHLD, &sa, NULL); 

En cuanto a la salida, los niños escriben a los mismos lugares que los padres a menos que los haya redireccionado de manera explícita (con close y open o dup, o una serie de otras posibilidades). Es probable que sus hijos estén imprimiendo mensajes de diagnóstico a error estándar (para eso es para eso, después de todo).

./spawnbot >logging.txt 2>&1 

Además, ya que parece que quieren separar a los niños de la terminal, es probable que quieren asegurarse de que no reciben un SIGHUP si matas a la terminal. Así que utilice nohup:

nohup ./spawnbot >logging.txt 2>&1 & 
disown