2011-10-20 3 views
3

Je ne suis pas très sûr de savoir comment créer un tube entre deux processus fils. Ceci est la façon dont je l'ai fait:Pipe dans le shell C UNIX

pipe(&fd[0]);        //Create a pipe 
proc1 = fork(); 

//Child process 1 
if (proc1 == 0) 
{ 
    close(fd[0]);       //process1 doenst need to read from pipe 
    close(STD_INPUT);      //prepare for output 
    dup(fd[1]);        //Standard output = fd[1] 
    close(fd[1]); 
    execvp(parameter[0], parameter);  //Execute the process 
} 

else 
{ 
    proc2 = fork(); 
    if (proc2 == 0) 
    { 
     close(fd[1]); 
     close(STD_OUTPUT); 
     dup(fd[0]); 
     close(fd[0]); 
     execvp(parameter2[0], parameter2); 
    } 
     //Parent process 
    else 
    { 
    waitpid(-1, &status, 0);   //Wait for the child to be done 
    } 
} 

Je suis en train de rediriger la sortie d'un processus enfant à l'autre, mais je pense que je fais une erreur avec le tuyau dans le deuxième processus de l'enfant parce que quand je lance le programme avec le 2ème processus enfant je reçois des résultats incorrects (comme une simple exécution comme "ls" est mal exécutée), cependant, si je supprime le second processus enfant, le programme tourne bien (pas de pipe, juste fork simple: ls, ls -l, ps, etc.).

Répondre

2

La meilleure réponse que je peux donner est Beej's Guide to Unix IPC.

(coup d'oeil à la section 4.3, où il donne un exemple très similaire à la question que vous avez demandé ...)

0

Dans la configuration processus enfant 1, close(STD_INPUT); dup(fd[1]); dupliquera fd[1] au plus bas descripteur disponible, ce qui est 0 (STD_INPUT) plutôt que 1 (STD_OUTPUT). Ne voulez-vous pas fermer STD_OUTPUT à la place? Aussi, je recommanderais dup2(fd[1], STD_OUTPUT) à la place de cette séquence; il fera ce que vous voulez et est plus clair quand même.

De même, le processus fils 2 utilise STD_OUTPUT où vous voulez probablement STD_INPUT.