2011-06-02 6 views
1

J'essaie d'ajouter un tuyau dans une mini-coque. Je suis confus, quand je tape ls | trier, rien ne s'affiche, je ne comprends pas pourquoi:Pipe() fork() et exec

int fd[2]; 
if (tube == 1){ 

    int pipeling = pipe(fd); 
    if (pipeling == -1){ 
     perror("pipe") ; 
    } 
} 


    tmp = fork();    //FORK A 

    if (tmp < 0){ 
     perror("fork"); 
     continue; 
    } 

    if (tmp != 0) {     //parent 
       while(wait(0) != tmp) ; 
       continue ; 
    } 

    if (tube == 1) {    //there is a pipe 

    if (tmp != 0){     //parent A 
     close(fd[1]); 
    } 

     if (tmp == 0){    //Child A      
      close(fd[0]); 
      dup2(fd[1], 1); 
      close(fd[1]); 
      execv(mot[0], mot); 
    } 

    int tmp2 = fork() ;    //FORK B 

    if (tmp2 != 0) {    //Parent B 
     close(fd[0]); 
     while(wait(0) != tmp2) ; 
     continue ; 
    } 

    if (tmp2 == 0){     //Child B 
     close(fd[1]); 
     dup2(fd[0], 0); 
     close(fd[0]); 
     execvp(mot[1], mot); 

    } 
} 

J'ai lu tous les sujets à ce sujet, mais cela ne fonctionne pas. Pouvez-vous m'aider? Edit: le deuxième code, j'essaie de changer la structure.

merci.

+1

Regardez http://stackoverflow.com/questions/5953386/writing-to-child-process-file-descriptor/5954324#5954324 –

+0

Vérifiez les appels système pour les erreurs - vous êtes au moins dup2'ing un close'd fd à un moment donné. Qu'est-ce que "mot"? Mon * devinez * est que vos arguments execvp sont incorrects. – pilcrow

+0

@pilcrow, j'ai édité le code, la commande mot est donnée sur la ligne de commande. – lilawood

Répondre

2

Le deuxième fork ne sera pas atteint au cas où execvp réussit, car ce dernier devrait remplacer l'image du processus et arrêter l'exécution du code actuel.

Vous devez restructurer votre programme.