Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/11/2007, 06:22
aeb_asturias
 
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.