Ciao.
Ho un problema con questo ciclo che praticamente dovrebbe eseguire dei comandi in pipe (proprio come fa la shell di Linux). Posto il codice:
codice:
for(i=1; i<res; ++i){
if((pid = fork()) < 0){
perror("fork error");
exit(FORK_ERR);
}
if(pid == 0){
if(args!=NULL){
free(args);
args=NULL;
}
args=(char **)calloc(MAX_ARGS,sizeof(char *));
if(do_I_launch_parse(commands[i]) == 1)
parse(commands[i],args);
if(i==res-1){
close(p[1]);
if(dup2(p[0],STDIN_FILENO) == -1){
perror("dup error");
exit(DUP_ERR);
}
close(p[0]);
}
else{
if(dup2(p[0],STDIN_FILENO) == -1){
perror("dup error");
exit(DUP_ERR);
}
if(dup2(p[1],STDOUT_FILENO) == -1){
perror("dup error");
exit(DUP_ERR);
}
close(p[0]);
close(p[1]);
}
((args[0]==NULL) ? execlp(commands[i],commands[i],NULL) : execvp(commands[i],args));
perror("exec failed");
exit(EXEC_ERR);
}
if(pid > 0){
if (waitpid(pid,&status,WNOHANG) == -1){
if(errno!=EINTR){
perror("waitpid error");
exit(WAIT_ERR);
}
else{
kill(pid,SIGTERM);
do{
if (waitpid(pid,&status,0) != -1)
break;
}while(errno==EINTR);
}
}
sleep(1);
}
}
Come potete vedere ho dovuto mettere WNOHANG nell'ultima waitpid() e fare una sleep(1) perché se non metto WNOHANG il padre aspetta indefinitamente che il figlio termini. Però non è una bella cosa scrivere il codice così, quindi lo dovrei modificare. La cosa strana è che il figlio fa tutto bene e mi dà anche l'output, solo che non termina e non capisco perché. Chi mi può dare una mano?
Grazie .