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?
Vous devez vous connecter pour publier un commentaire.
J'ai pris le paresseux moyen de sortir, et écrit mes propres plutôt que de fixer un autre code. Traiter cela comme "encore un autre tuyau-raccord exemple en C", mais il pourrait aider à préciser les questions avec l'OP du code.
Un problème majeur est ici:
Ici vous fermez d'abord les descripteurs de fichier, puis plus tard dans le programme que vous essayez de les utiliser à nouveau.
Il y a quelques problèmes dans votre code:
Vous faites un petit-enfant de la première étape du processus
Vous êtes bifurquer et ensuite bifurquer à nouveau de sorte que le parent d'un enfant, puis deux d'entre eux sont de faire un enfant chacun. À ce stade, vous avez déjà 4 processus.
Votre code pourrait être quelque chose comme cela dans la partie:
Vous êtes en attente de l'enfant à la fin.
Waitpid ne serait pas nécessaire si vous utilisez le processus parent pour exécuter la dernière commande sur le tuyau (
wc
). Mais c'est à vous, si vous voulez avoir un processus parent. Si oui, vous devez appeler lewaitpid
une fois que tous les enfants sont de faire ses tâches.Il ne faut pas fermer le tuyau avant dup2..
L'erreur que vous avez posté, qui semble être à cause de cela.
Après dup2, vous devez fermer la conduite de l'enfant.
Si vous allez avoir un parent, vous devez le fermer une fois les deux enfants ont dupped il.
Vous n'êtes pas la vérification de tous, le retour éventuel état de certaines fonctions.
Il y a quelque chose d'autre pour améliorer