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:
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?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); } }
Grazie .![]()

Rispondi quotando
