Foros del Web » Programación para mayores de 30 ;) » Programación General »

Hilos + fork = ?

Estas en el tema de Hilos + fork = ? en el foro de Programación General en Foros del Web. Holas ... Estoy tratando de crear una aplicacion que me crea un hilo "g_thread_create" y dentro de este crea un proceso "fork", no me funciona, ...
  #1 (permalink)  
Antiguo 21/04/2005, 04:56
Avatar de kapachov  
Fecha de Ingreso: diciembre-2002
Ubicación: Loeches
Mensajes: 464
Antigüedad: 21 años, 11 meses
Puntos: 0
Hilos + fork = ?

Holas ...

Estoy tratando de crear una aplicacion que me crea un hilo "g_thread_create" y dentro de este crea un proceso "fork", no me funciona, no se que puedo estar haciendo mal (no soy un experto programando) ,
pego aqui el codigo :

--
gint main (gint argc, gchar *argv[])
{
do
{
hilo_cliente();
}while(1);

return 0;
}

gint cliente()
{
GMainLoop *bucle;

gint proceso_fork, estado_fork;

proceso_fork = fork();
if (proceso_fork == -1 )
g_print ("\n/- BREAK POINT NO CREA EL FORK -/\n"), exit(1);
else if (proceso_fork == 0)
{
g_print ("\n/- BREAK POINT CREA EL FORK -/\n");
exit(0);
}

while (wait(&estado_fork) != proceso_fork);

if (WIFEXITED(estado_fork) != 0)
g_print ("\nTERMINO EL PROCESO HIJO BIEN");
else
g_print ("\nTERMINO EL PROCESO HIJO MAL");


if (g_thread_self != NULL)
g_thread_exit (self);
else
exit(1);
return 0;
}

gint hilo_cliente ()
{
GError **error;

if (!g_thread_supported ())
g_thread_init (NULL);

g_thread_create(cliente,NULL,TRUE,error);

return 0;
}
---

Yo creo que hacer esto es posible pero no estoy seguro, pues la maquina una vez se ejecuta el programa pasado un tiempo se pone lenta... lenta.. lenta... lenta... y luego ya no va se bloquea !!
__________________
Siempre hago lo que quiero...
Aunque no quiera...

Última edición por kapachov; 21/04/2005 a las 07:16
  #2 (permalink)  
Antiguo 21/04/2005, 06:12
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Mmm revisa el código si lo has cambiado. Ese thread_create hace referencia a una función "cliente", que supongo que será la de "cliente_sockets". Por otra parte, es normal que cada vaya más lenta, porque estás haciendo un do{}while(1) continuo mientras creas más y más procesos. Y dentro de esa función un fork... Dime qué pretendes hacer y qué intenta hacer ese código, porque lo de juntas un "fork" con otra manera de crear procesos...
  #3 (permalink)  
Antiguo 21/04/2005, 07:27
Avatar de kapachov  
Fecha de Ingreso: diciembre-2002
Ubicación: Loeches
Mensajes: 464
Antigüedad: 21 años, 11 meses
Puntos: 0
Holas...

Gracias por la correción, bueno ahora mismo lo que estaba probando es el crear un fork dentro en un hilo, pero la finalidad es la de crear una funcion que recibe 3 parametros entre ellos (la IP, los otros es info para trabajar dentro del socket) y se conecte a servidor (este es el que crea el socket y espera por conexiones)...

Estaba simulando la llamada del cliente al server desde el while(1); este funciona pero de un momento a otro se coloca lento y lento .......
comence a revisar la memoria...
comence a quitarle cosas a mi programa ....
hasta que lo deje como esta ahora! y sigue igual

Ahora mismo no recuerdo porque he decidido meter un fork dentro del hilo, estoy resolviendo esa duda, han sido varios dias de estar luchando con esto y ahora de verdad que no lo recuerdo....
__________________
Siempre hago lo que quiero...
Aunque no quiera...
  #4 (permalink)  
Antiguo 21/04/2005, 07:50
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Jur. Vamos a ver. Si no sabes ni lo que estás haciendo, borra el código xD. Si la máquina va lenta, es porque estás creando procesos sin parar, o éstos se crean más rápido de lo que mueren los otros.

En serio, no mezcles formas específicas de hacer procesos con fork y demás. Controla qué procesos creas y cuales no.

PD: Yo eso lo hago con C++, una clase que crea destruye y regula el "habla" con el programa principal, mientras el thread trabaja en algo repetitivo.
  #5 (permalink)  
Antiguo 21/04/2005, 08:28
Avatar de kapachov  
Fecha de Ingreso: diciembre-2002
Ubicación: Loeches
Mensajes: 464
Antigüedad: 21 años, 11 meses
Puntos: 0
Holas...

Gracias por tu atención y colaboración.

Si se lo que estoy haciendo la unica duda es que no recuerdo el porque de crear el fork dentro del hilo; creo que he encontrado la solucion bueno en realidad me esta ayudando también un compañero de trabajo !!

esta es la mia...

while (waitpid(proceso_fork,&estado_fork,WNOHANG) != proceso_fork);


La de el es mas completa porque cada que crea un HILO guarda la direccion de memoria de este! y cada que crea un proceso tambien guarda el PID , así cuando el waitpid recibe la señal de que el PID .... este busca el PID, EL HILO, y lo mata y así se asegura de terminar el HILO que debe terminar! ... bueno de momento tengo las 2 opciones! pero me inclinare por la de mi compañero...
__________________
Siempre hago lo que quiero...
Aunque no quiera...
  #6 (permalink)  
Antiguo 21/04/2005, 09:15
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Bien. En cualquier caso, yo no crearía procesos al azar. Quiero decir: thread_create crea un thread, que a su vez creará fork más metralla... Vamos, que se forma tal grumo de hilos que en fin xD Además es raro hacer lo que haces... De los códigos que necesitan threading (servers y cosas repetitivas) no sé de ninguno que requiera hacer lo que haces... ¿Qué haces?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:21.