Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160

    [C] Il figlio non termina

    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 .

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Nessuno?

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ora mi sono accorto anche che se metto più di 2 comandi in pipe (ad esempio 3), non mi visualizza l'output del 3° (cioè dell'ultimo comando). Aiuto!!!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    160
    Ho scoperto una nuova cosa. E' la pipe p[0] che si "blocca". Infatti se provo ad aggiungere l'istruzione fcntl(p[0],F_SETFL,O_NONBLOCK); allora quando eseguo un comando in pipe mi dà il seguente output:

    codice:
    /home/manugal/Progetto  $ ls -l | grep *.h
    -rw-r--r-- 1 manugal manugal  3364 2007-01-11 13:28 functions.h
    -rw-r--r-- 1 manugal manugal  3371 2007-01-11 13:10 functions.h~
    grep: (standard input): Risorsa temporaneamente non disponibile
    A questo punto non è un problema del figlio che non termina ma della pipe di input che sembra non abbia dati e quindi si blocca. Ma non riesco a capire perché non ha dati. Vi prego, aiutatemi

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.