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