UTNianos

Versión completa: [Sistemas Operativos] Problema procesos hijos
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola! estoy arreglando el tp de so y me surgio un problema inesperado de ultimo momento. Para los que esten al tanto, tengo un servidor de archivos, que genera un proceso hijo con fork por cada descarga que un cliente quiere realizar, el problema es el siguiente, cuando la descarga termina, y el proceso hijo termina, no desaparece, si vamos a otra consola y escribimos ps -fa veremos que el hijo sigue en el sistema, aunque ya no hace nada y no va a volver a hacer NADA. El problema es que los hijos se acumulan y cuando son muchos hacen que el sistema se vuelva inestable, queria saber si hay alguna forma de hacer que cuando el proceso hijo termina de hacer sus cosas, que muera o algo asi, asi no se me acumulan y el sistema no se cae. Muchas Gracias!!!!!
Tenes que llamar a la funcion Exit(codigo de salida) envez de return. Bah, por las dudas, llama a exit y despues a return, pero supuestamente nunca deberia llegar al return

De todas formas, te lo prueban con 3 gnutella..... quilombo no vas a tener.

Saludos!!!!
Es raro, porque al final del codigo del proceso hijo, tengo un exit, y sin embargo si tiras un ps, vas a ver todos los hijos ahi cargados, no se que hacer para que mueran.
Con exit() se muere.

Revisá tu código a ver si llega a esa línea.
Usa el gdb y antes de ejecutarlo, hace break <num linea>.

Si no lo sabes usar, te resumo:

compilas con: gcc -g blabla.c
despues haces gdb --args a.out <argumentos si es que tiene>
te aparece un prompt loco.

tecleas break <numero de linea en donde este el exit ()>, enter.

y luego ..... creo que R de run o C de continue... eso mejor fijate por internet :P, con eso ejecuta el programa
Cuando llegue a la linea, corta. Si tiene algun error, podes chequear las variables en el momento.....

Para continuar despues del break, tocas C.
Despues tenes un comando List que te muestra las proximas 10 lineas, y millones de cosas mas copadsa (como breakpoints de una sola pasada, o que corta cada X veces (copado para bucles), watchpoints, etc.....)

Te recomiendo que busques GCC Debuger o algo asi, a nosotros nos simplifico bastante la parte de linux en el tp.

Y si das despues de las vacas....el DDD, que (supuestamente, ya que este no lo use) te visualiza las estructuras de datos estaticas y dinamicas, sabiendo si estas perdiendo punteros, liberando bien la memoria, etc.....


Saludos, y espero que te sirva!!!!
Nota al margen: Acordate que no tienen que quedar archivos descargando una vez que cerras el servidor.
estas capturando la señal que manda el proceso hijo al padre para saber que termino??, sino haces esto va a quedar zombie ( que por lo que entendi del man ese estado nada mas ni menos esd la señal que le manda al padre sin capturarla)
lo podes ahcer de varias maneras una con wait, pero esa funcion es bloqueante con lo que el proceso padre no seguiria ejecutando, por lo que no te sirve yo para eso lo que hice fue capturarla con signal e ignorarla, con lo cual solo tenes que al principio del main llamar a la funcion signal de esta manera signal(SIGCHLD,SIG_IGN); la primera es la señal que manda el proceso hijo y el segundo parametro le decis que la ignore por que lo unico que tenes que hacer para que desaparesca el proceso hijo es capturarla.
saludos
fedex86 escribió:estas capturando la señal que manda el proceso hijo al padre para saber que termino??, sino haces esto va a quedar zombie ( que por lo que entendi del man ese estado nada mas ni menos esd la señal que le manda al padre sin capturarla)
lo podes ahcer de varias maneras una con wait, pero esa funcion es bloqueante con lo que el proceso padre no seguiria ejecutando, por lo que no te sirve yo para eso lo que hice fue capturarla con signal e ignorarla, con lo cual solo tenes que al principio del main llamar a la funcion signal de esta manera signal(SIGCHLD,SIG_IGN); la primera es la señal que manda el proceso hijo y el segundo parametro le decis que la ignore por que lo unico que tenes que hacer para que desaparesca el proceso hijo es capturarla.
saludos



Eso es exactamente lo que hay que hacer, nosotros teníamos el mismo problema, y nuestro ayudante nos dijo eso, después todo solucionado
URLs de referencia