Linux/Unix Shell Scripting - Ejecucion en 2º plano de un proceso

 
Vista:

Ejecucion en 2º plano de un proceso

Publicado por Miguel (1 intervención) el 01/06/2007 17:14:47
Mi duda es como hacer que el proceso hijo lanzado en 2º plano se espere de verdad y no se lance


Hasta elmomento en un interprete de comandos personalizado he hecho esto:


while (true) {

do{
// Imprime el prompt
cout <<"\n"<< el_prompt << " ";
// Lee una linea desde la entrada estándar
getline(cin, comando);
}while(comando=="");

int n=0,pid2=0,pid=0;
// Separa el comando en ejecutable más argumentos, en comando_argv.
n=ObtieneArgumentos(comando,comando_argv);

//comprobamos si tenemos que salir o no
if (ComandoInterno(comando_argv,dicc,el_prompt,pid,n)){

}else{//sino creamos un proceso hijo y lanzamos el comando
int ppid=getpid();
pid=fork();
if( strcmp(comando_argv[n-1],"&")==0 )
dicc[pid]= comando;//almaceno el valor del pid en una lista de procesos en 2º plano

//¿como se hace para que la ejecucion de el comando en 2º plano no sea apropiativa?
if(!pid){

if( strcmp(comando_argv[n-1],"&")==0 ){
for(int i=0;i<n-1;i++){
comando_argv2[i]=comando_argv[i];
}
//******************************************************************************************************

int aux=execvp(comando_argv2[0], comando_argv2);
if (aux == -1)
cout << comando_argv2[0] << ": Comando no encontrado." << endl;
//********************************************************************************************************
}else{
//signal( SIGINT, SIG_DFL );
//primer plano
// Ejecuta el comando indicado por el usuario
if (execvp(comando_argv[0], comando_argv) == -1)
cout << comando_argv[0] << ": Comando no encontrado." << endl;
}
}else{//fin if(!pid)

if(strcmp(comando_argv[n-1],"&")!=0){
//esperamos
//for(iter=dicc.begin() ; iter != dicc.end(); ++iter )
//kill(iter->first,0);
//primer plano
cout<<"esperamos"<<endl;

while((pid2=wait(status))!=pid){//fin 2º plano
dicc.erase(pid2);
if(WIFEXITED(status))
cout<<"Acaba el proceso en 2º plano "<< pid2<< " normalmente"<<endl;
if(WIFSIGNALED(status))
cout<<"El proceso "<<pid2<<" a caba por causas desconocidas"<<endl;
cout<<"El estado con que acaba el hijo es:"<<WEXITSTATUS(status)<<endl;
}//fin primer plano
}else{ //else de if(strcmp(comando_argv[n-1],"&")!=0)
cout<<"no esperamos"<<endl;

}//fin if(strcmp(comando_argv[n-1],"&")!=0)
}//fin if(!pid)else
}//fin while(true)
}//fin else1
} //fin main
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ejecucion en 2º plano de un proceso

Publicado por Tom (361 intervenciones) el 04/06/2007 11:58:27
No uses execv. Utiliza system o fork (o cualquier otra cosas que cree un subproceso).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar