Foros del Web » Programación para mayores de 30 ;) » C/C++ »

creando proceso hijo con fork()

Estas en el tema de creando proceso hijo con fork() en el foro de C/C++ en Foros del Web. Hola a todos. Tengo el siguiente problemilla. Tengo un programa cuyo objetivo es lanzar un experimento y una vez finalizado se actualice un registro de ...
  #1 (permalink)  
Antiguo 05/11/2007, 06:22
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 8 meses
Puntos: 7
Sonrisa creando proceso hijo con fork()

Hola a todos.

Tengo el siguiente problemilla.

Tengo un programa cuyo objetivo es lanzar un experimento y una vez finalizado se actualice un registro de la base de datos para indicar que ya ha finalizado dicho experimento.

Así que hago una llamada fork() de manera que el proceso hijo lance el experimento y el proceso padre espere por su terminación y una vez ocurrido esto actualice la base de datos.

Mi problema es que necesito que cuando el proceso hijo lance el experimento (que es un ejecutable cualquiera) se actualice la base de datos en ese momento para indicar que el experimento ya se esta ejecutando. Y esto nose como se hace.

Ejemplo de mi código:



pid_t pid=fork();
int result,valor;

switch (pid){

case -1:
cout<<"Error al crear el proceso hijo"<<endl;
break;

//Proceso hijo
case 0:
{

pid_t id_proceso;
id_proceso=getpid();

result=execl("experimento",NULL);
if(result==-1){
cout<<"El proceso hijo fallo al lanzar el proceso"<<endl;
ofstream out("error.txt");
out<<"error"<<endl;
out.close();
}
else
cout<<"Exito al lanzar el proceso hijo el proceso"<<endl;
break;

}

//Proceso padre
default:
while(wait(&valor)!=pid);
-------------------------------
-------------------------------


Cuando el proceso hijo lanza el ejecutable "experimento" se queda ahi colgado hasta que termine su ejecución y entonces él no puedo actualizar la base de datos.

Y el proceso padre no sabe cuando el proceso hijo ya ha ejecutado la llamada al metodo execl y por tanto ya ha lanzado el experimento porque sino el podria actualizar la base de datos.


Nose si existe alguna manera de que justo cuando se ejecute el método execl poder realizar mi tarea de actualizar la base de datos porque como lo tengo ahora el proceso hijo esta parado ejecutando el comando execl y el proceso padre esta parado esperando la terminación del hijo.


Y otra cosa:

Curiosamente nunca se me ejecuta la linea del ese:

cout<<"Exito al lanzar el proceso hijo el proceso"<<endl;

Es decir, el proceso hijo cuando se ejecuta perfectamente nunca me imprime esa linea, en cambio si falla la llamada a execl si que me imprime la linea de que el proceso hijo fallo al lanzarse. No lo entiendo.


Saludos.
  #2 (permalink)  
Antiguo 05/11/2007, 13:09
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Re: creando proceso hijo con fork()

La llamada a exec*() reemplazan la imagen del proceso actual con una nueva del que indicas.

Es decir, para que lo entiendas mejor, el programa original "desaparece" si todo sale bien, por lo que no se sigue ejecutando.

Lo mejor que puedes hacer si sólo quieres ejecutar un comando que vuelva, es usar system(). De hecho, system() hace algo similar a lo que tú tratas de hacer a mano. Puedes resumir tu código con:

Código:
if (system("experimento") == 0)
    cout << "El experimento terminó bien" << endl;
else
    cout << "El experimento terminó mal o no se pudo iniciar, con código " << result << endl;
O algo del estilo.

Última edición por MaxExtreme; 05/11/2007 a las 13:18
  #3 (permalink)  
Antiguo 05/11/2007, 13:48
 
Fecha de Ingreso: marzo-2004
Mensajes: 550
Antigüedad: 20 años, 8 meses
Puntos: 7
Re: creando proceso hijo con fork()

Muchas gracias MaxExtreme.

Como bien dices, si la función execl se ejecuta correctamente nunca se retoma la ejecución del programa original desde el punto donde se ha llamado.

En cambio con System si.


Hay alguna manera para que la funcion "System" no sea bloqueante??

Es que lo que necesito es saber si se lanzó bien el proceso contenido en la llamada System para actualizar mi base de datos indicando que el experimento está ejecutandose para que luego un usuario desde una ventanita pueda saber que se esta ejecutando dicho proceso.

Como System se me bloquea hasta que finaliza su ejecución, nunca obtengo de nuevo el control hasta que acaba la ejecución y entonces ya no tiene sentido actualizar mi base de datos ya que finalizó :(
  #4 (permalink)  
Antiguo 05/11/2007, 14:40
Avatar de _Lucifer_  
Fecha de Ingreso: junio-2006
Mensajes: 1.662
Antigüedad: 18 años, 5 meses
Puntos: 28
Re: creando proceso hijo con fork()

¿Y por que no creas un hilo con pthread_create que "lance" el system en segundo plano, continuas con la ejecución y guardas en la BD?

Saludos
__________________
Si crees que no tiene sentido, etonces probablemente lo tenga... :arriba:
  #5 (permalink)  
Antiguo 06/11/2007, 01:12
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 7 meses
Puntos: 17
Re: creando proceso hijo con fork()

Entonces lo que necesitas es algo bien distinto a system(). Podrías usar el esquema tuyo inicial de fork() y exec(). Simplemente, en el while() del padre, mientras esperas, sabrás que el proceso hijo ha terminado, no tienes necesidad de hacer nada al acabar el hijo (como intentabas antes).

O bien, lo que dice _Lucifer_.
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 13:43.