2017-04-26 1 views
0

J'utilise dup2(), pipe() et fork() pour traiter des commandes avec l'entrée d'un autre. La sortie du ls est correctement passée dans cat, et le terminal affiche la sortie, mais n'arrête pas de recevoir l'entrée. En d'autres termes, le chat ne se termine pas, donc je peux continuer à taper.exec() ne se termine pas lorsqu'il est utilisé avec dup2

#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <sys/stat.h> 
int main() { 
    int pipefd[2], child_pid, grand_child; 

    pipe(pipefd); 

    child_pid = fork(); 

    if (child_pid) { 
     waitpid(child_pid, NULL, 0); 
     /* Parent */ 

     grand_child = fork(); 

     if (!grand_child) { 
     dup2(pipefd[0], STDIN_FILENO); 
     close(pipefd[0]); 
     close(pipefd[1]); 
     execlp("cat", "cat", NULL); 
     } else { 
     waitpid(grand_child, NULL, 0); 
     } 

    } else { 
     /* Child */ 

     dup2(pipefd[1], STDOUT_FILENO); 

     close(pipefd[1]); 
     close(pipefd[0]); 


     execlp("ls", "ls", NULL); 
    } 

    return 0; 
} 
+0

Peut-être que le problème est que vous fermez 'pipefd' avant d'exécuter' ls'? Et même chose pour 'cat'. – theoden

+0

Notez qu'attendre que le premier enfant d'un pipeline se termine avant de commencer le suivant est la mauvaise façon de faire les choses. Il force l'exécution linéaire/séquentielle au lieu de permettre l'exécution parallèle/simultanée. Il peut également être bloqué si le premier processus dans le pipeline génère autant de données qu'il est bloqué en attendant que le processus suivant en lise, mais le processus suivant n'est pas démarré car le premier n'est pas encore terminé. –

Répondre

1

Le parent a toujours le côté d'écriture du tuyau ouvert. cat attend que le parent le ferme et le parent attend cat pour se terminer. Vous devriez fermer les deux côtés du tuyau dans le parent avant d'attendre le grand enfant.

+0

C'est correct, merci! –