Mauvais descripteur de fichier d'erreur lors de la mise en œuvre de la tuyauterie en C

Je suis en train de mettre en oeuvre un exemple de shell comme programme qui exécute la commande ls | wc

À l'aide de tuyaux pour mettre en œuvre la commande. Lorsque j'exécute la commande j'obtiens l'erreur suivante.

wc: standard d'entrée: Mauvais descripteur de fichier
0 0 0
wc: -: Mauvais descripteur de fichier

Veuillez jeter un coup d'oeil au code et à fournir des contributions
Remarque: 1) analyser est une bibliothèque qui prend en entrée tapé et renvoie à chaque commande qu'une liste liée avec des arguments et nécessaire des données. Analyser fonctionne bien
2) je suis l'exécution de chaque commande dans un autre sous-processus où la fourche

#include <stdio.h>
#include <stdlib.h>
#include "parse.h"

int pip[3][2];
int main(int argc, char *argv[], char *envp[])
{
    Pipe p; 
    Cmd c;
    pipe(pip[0]);
    pipe(pip[1]);   
    pid_t pid;
    pid=fork();
    char *host = "armadillo";
    printf("%s%% ", host);
    p = parse();
    c=p->head;  
    printf("1 \n");
    pid=fork();

    if(pid==0)
    {
        close(pip[0][0]);
        close(STDOUT_FILENO);
        dup2(pip[0][1],STDOUT_FILENO);
        execvp(c->args[0],c->args);
    }
    else
    {
        waitpid(pid,NULL,0);
    }
    printf("2 \n");

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

    c=c->next;
    printf("%s \n",c->args[0]);
    pid=fork();
    if(pid==0)
    {
        close(STDIN_FILENO);
        dup2(pip[0][0],STDIN_FILENO);
        close(pip[0][1]);
        execvp(c->args[0],c->args);
    }
    else
    {   
        waitpid(pid,NULL,0);
        close(pip[0][1]);
        close(pip[0][0]);
    }

}
  • Pourquoi êtes-vous de séparer en deux fois? Je veux dire le fork Appelez-vous faire avant de faire quoi que ce soit, pourquoi tu fais ça?
  • Je suis l'exécution de chaque commande dans un autre sous-processus Donc une fourchette pour les ls et les autres pour wc
  • Soyez prudent lorsque vous fermez le tuyau de descripteurs. Aussi, les processus dans les pipelines doivent tous être capable de fonctionner à la fois; si vous attendez le premier à terminer avant le lancement de la deuxième, vous avez peut-être écrire plus de données que celui qui entre dans le tuyau, de sorte qu'il bloque en attente pour le deuxième processus de lecture à partir de la pipe, mais la deuxième processus ne sera pas lancé avant la première complète, de sorte que rien ne se passe pendant un temps très long.
  • les deux extrémités du tube doit être ouvert en même temps, sinon écrit à la pipe va échouer.
  • Pourquoi il y a plusieurs tuyaux étant ouvert?
InformationsquelleAutor kairav | 2014-10-12