Author Topic: Problemas con fork dentro de un hilo  (Read 7108 times)

zildjian

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
Problemas con fork dentro de un hilo
« on: Octubre 07, 2009, 01:21:13 am »
Hola a todos!

Estoy desarrollando un proceso demonio en C. Este demonio es multihilo debido a que tiene que atender a varios recursos simultáneamente. Los hilos se comunican entre sí mediante recursos compartidos controlados mediante semáforos. Hasta este punto todo ok.
El problema lo tengo en uno de los hilos. Este hilo problemático lo que tiene que hacer es ejecutar instancias de un programa cuando se lo indique otro de los hilos. La única forma que se me ocurre para lanzar un programa desde el interior de un hilo es hacerlo mediante el fork y dentro del proceso hijo creado, hacer el exec para cambiar la imagen del proceso hijo a la del nuevo programa.

Mi pregunta es, habeis lanzado alguna vez programas desde el interior de un hilo?
En caso positivo, ¿como lo habeis implementado, porque yo estoy teniendo un problema?

El problema que estoy teniendo con el fork + exec dentro del proceso hijo creo que es el siguiente:
El proceso demonio es de por sí multihilo.
Hacer un fork supone crear un proceso hijo como copia de un proceso padre, creando un nuevo espacio de memoria copia del padre para el hijo. Si el proceso padre es multihilo y el fork se realiza desde el interior de uno de sus hilos, el fork creará la copia del proceso padre, y por ser multihilo, copia todos los hilos. Si en uno de esos hilos se hace un fork, se copia el hilo del fork, por lo que es como si el fork se copiase a sí mismo. En definitiva, que se crea un bucle en el que no para de lanzarse instancias del programa al que pretendo invocar cuando simplemente quiero invocarlo una vez desde el interior de un hilo.
Por lo que he encontrado por la web, que ha sido poco, lo que para mi es un problema, para otros es la implementación de una bomba fork.

Espero haberme explicado con suficiente claridad.
Si teneis alguna solución a este problema, os lo agradecería bastante.
Un saludo a todos!

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas con fork dentro de un hilo
« Reply #1 on: Octubre 07, 2009, 02:11:33 am »
Hola:

fork() devuelve distinto valor al original y al proceso copia. ¿No te vale eso para distinguir si seguir o no haciendo fork? No entiendo porqué la copia tiene que volver a hacer un fork() ni por qué otro hilo de la copia tiene que hacer fork() si nadie se lo manda.

Se bueno.

zildjian

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #2 on: Octubre 07, 2009, 03:59:02 am »
Hola!

Lo primero, gracias por mostrar interés en el problema.

>fork() devuelve distinto valor al original y al proceso copia. ¿No te vale eso para distinguir si seguir o no
>haciendo fork? No entiendo porqué la copia tiene que volver a hacer un fork() ni por qué otro hilo de la
>copia tiene que hacer fork() si nadie se lo manda.

No entiendo del todo tu respuesta, muy probablemente por mi falta de conocimiento. No obstante intentaré explicarme de otra forma. El problema no lo tengo con el valor devuelto del fork, eso está controlado. EL problema está en dónde se está haciendo el fork. Si no estoy equivocado, corregidme si me equivoco, el fork crea una copia del proceso padre (variables,etc...) y genera un proceso hijo copia del padre con su espacio de memoria propio, copia del padre, pero independiente del padre. 

Un fork en un proceso que es multihilo, también copia todos los hilos del proceso padre, es decir, está duplicando el espacio de memoria (todos los hilos del proceso padre y sus variables son copiadas en un nuevo espacio de memoria que queda reservado para el nuevo proceso hijo).

Si el fork lo estás haciendo "dentro de un hilo del proceso padre", en realidad estas copiando el espacio de memoria del proceso padre, es decir, todas sus variables y todos sus hilos, por lo que si dentro de uno de sus hilos (el hilo1 por ejemplo) haces el fork, como estas copiando los hilos, estas copiando el fork que hay dentro del hilo1.

Al menos ese problema es que el que me está apareciendo a mí. Una prueba simple para probar lo que te comento:
- Tengo un proceso.
- En su interior genero 3 hilos.
- Dentro de uno de esos hilos hago un fork.
- En el proceso hijo creado pongo un printf(comentario).
- Si ejecutas el proceso, empieza a mostrarte el comentario por pantalla infinidad de veces.
Como no le mandes un sigkill al proceso, no para, o hasta que agotes el número de procesos en ejecución que admita tu sistema operativo, en cuyo caso el fork devolvería el código de error corespondiente.

Un saludo. Espero que entre todos se pueda buscar una solución y que el caso os aporte algo.

chuidiang

  • Administrator
  • Hero Member
  • *****
  • Posts: 5472
  • Karma: 12
    • View Profile
    • Apuntes de programación
Re: Problemas con fork dentro de un hilo
« Reply #3 on: Octubre 07, 2009, 04:04:16 am »
¿Puedes poner el trozo de código en el que llamas al fork() y la llamada al printf()?

Se bueno.

zildjian

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #4 on: Octubre 07, 2009, 04:33:32 am »
int invocar_mplayer(pid_t *ppid_mplayer,char modo,char* fifo_ctl,
                                char *file_marcas,char *path_file_local)
{
  int resultado=NO_ERROR;

  if( (*ppid_mplayer=fork())==ERROR ){
    resultado=ERROR;
    printf("Error al crear instancia de mplayer\n");
  }

  else{

    if( (*ppid_mplayer)==PROCESO_HIJO ){
      //Proceso hijo

      printf("Soy el proceso hijo y voy a ejecutar mplayer\n");
     
      //resultado=execl(SCRIPT_PATH,SCRIPT_NAME,                             
      //&modo,path_file_local,
      //fifo_ctl,file_marcas,NULL);
      //Si retorna es que hubo error
      //resultado=ERROR;

    }

    else{
      //Proceso padre
      printf("Soy el proceso padre y sigo por donde iba\n");
      resultado=NO_ERROR;
    }

  }

  return resultado;

}



zildjian

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #5 on: Octubre 07, 2009, 04:35:03 am »
NO_ERROR=0
ERROR=-1
PROCESO_HIJO=0

zildjian

  • Newbie
  • *
  • Posts: 5
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #6 on: Octubre 07, 2009, 04:43:32 am »
Esta función es invocada desde uno de los hilos del proceso. Como comprobareis, el proceso hijo simplemente está mostrando un mensaje por pantalla (lo que realmente debería hacer está comentado). En caso de seguir la ejecución del padre, éste tambien muestra un simple mensaje.

Como he explicado en un post anterior, el mensaje que muestra el proceso hijo se muestra infinidad de veces junto con el del padre. Para parar, es necesario mandar un sigkill. Si no mandas el sigkill y dejas que siga corriendo, llega un momento en el que dejan de mostrarse ambos mensajes y pasa a mostrarse por consola el mensaje de error en el fork, debido a que el S.O no deja tener más procesos en ejecución.

Un saludo y gracias por el interés!

ivan

  • Newbie
  • *
  • Posts: 6
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #7 on: Noviembre 25, 2009, 05:50:15 am »
Hola! veo que tratas el tema de hilos. yo necesito un ejemplo de hilos, si pudieras ayudarme te lo agradecería mucho!!
http://www.chuidiang.com/clinux/procesos/procesoshilos.php

a qui biene un ejemplo pero no me corre me sale este error, bueno no es error mas bien avisos pero no veo como funciona

ivan@ivan-laptop:~/Escritorio/hilos2$ gcc pthread.c -lpthread -o pthread
pthread.c: En la función ‘main’:
pthread.c:45: aviso: declaración implícita incompatible de la función interna ‘exit’
pthread.c:52: aviso: declaración implícita incompatible de la función interna ‘printf’
pthread.c: En la función ‘funcionThread’:
pthread.c:63: aviso: declaración implícita incompatible de la función interna ‘printf’



fabionicoliellofab

  • Newbie
  • *
  • Posts: 2
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #8 on: Mayo 24, 2016, 05:46:25 am »
efectivamente te quedó tipo bomba fork

     tienes que detener el bucle con alguna condición de salida,

           gracias !


fabionicoliellofab

  • Newbie
  • *
  • Posts: 2
  • Karma: 0
    • View Profile
Re: Problemas con fork dentro de un hilo
« Reply #9 on: Mayo 24, 2016, 05:49:16 am »
     sigkill parece ser una buena opción, como nos mostró el compañero,

          gracias !

 

ey