Pipes, dup2 et exec()

Je dois écrire un shell qui peut exécuter des tuyaux. Par exemple des commandes comme ls -l | wc -l". J'ai réussi à analyser la commande donnée par l'utilisateur comme ci-dessous:

"ls" = firstcmd

"-l" = frsarg

"wc" = scmd

"-l" = secarg

Maintenant je dois utiliser deux fourches puisque les commandes sont deux et d'un tuyau.
Le bloc de code que j'ai écrit à exec de la commande est la suivante:

pid_t pid;
int fd[2];

pipe(fd);
pid = fork();

if(pid==0)
{        
    dup2(fd[WRITE_END], STDOUT_FILENO);
    close(fd[READ_END]);
    execlp(firstcmd, firstcmd, frsarg, (char*) NULL);
}
else
{ 
    pid=fork();

    if(pid==0)
    {
        dup2(fd[READ_END], STDIN_FILENO);
        close(fd[WRITE_END]);
        execlp(scmd, scmd, secarg, (char*) NULL);
    }
}

Donc, quand je lance ma coquille et je entrez la commande ls -l | wc -l (par exemple) le résultat de la execs n'apparaît pas, mais le shell continue de fonctionner normalement.

La chose étrange est que le résultat de la commande indique que lorsque j'ai résilier mon shell avec "exit" ou "^C".

Quel est le problème avec cette sortie? Pourquoi ne pas apparaître tout de suite après je entrez la commande?

Vous devez fermer le tuyau FDs dans le processus parent.
Pouvez-vous modifier mon code pour m'aider à comprendre ce que tu veux dire s'il vous plaît? @Barmar
Règle: si vous dupliquez une extrémité du tuyau à l'entrée standard et la sortie, vous devez fermer les deux extrémités des tubes d'origine avant d'utiliser exec*() fonctions (ou continue). Il y a des exceptions; ils sont peu et loin entre. Il est très rare (sur soi, et IRL) que vous rencontrez un programme à l'aide de tuyaux qui ferme trop grand nombre de descripteurs; il est très fréquent de trouver un programme qui n'est pas assez proche de descripteurs. C'est particulièrement courant si il y a plusieurs enfants et/ou de plusieurs tuyaux pour confondre les choses.
D'ailleurs, si vous regardez le code dans le github.com/jleffler/soq/tree/master/src/so-4380-8114, vous trouverez un exemple intéressant où "ne ferme pas assez de descripteurs de fichiers causé l'échec du programme sur une assez grande facteurs de production". Lorsque l'entrée était petit, il a bien fonctionné. Lorsque l'entrée est assez grand, le programme coincé dans l'impasse parce que les tuyaux n'ont pas été fermée correctement. (Non, le code de brouillage n'est pas directement sur le Débordement de la Pile.)

OriginalL'auteur Aris Kantas | 2015-11-24