[C:tubes] Mauvais descripteur de fichier

adi3000 Messages postés 254 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je suis en train de creer un PseudoShell, mais le soucis c'est que mes tubes ne fonctionnent pas, je vous montre mon code:

char*** cmd;
int flag;
int nb;
int i;
int *in; int *out;
int pid;
int codecmd;
int tube[2];
cmd = ligne_commande(&flag, &nb); //ligne commande renvoie un tableau de tableau de chaine
//de type [commande][argument] un pipe determine une nouvelle commande, un espace un nouvel argument
//chaque fin de ligne dans le tableau est suivi de NULL
int statut;
[...]
else//si il y a un pipe
----------------- {
----------------------- in=(int*)malloc(sizeof(int));
----------------------- pipe(tube);
----------------------- printf("Tube créé : %d -> %d\n",tube[0],tube[1]);
----------------------- for(i=0; cmd[i]!=NULL;i++)
----------------------- {
----------------------------- if(i==0) //premier
----------------------------- {
----------------------------------- puts("premier");
----------------------------------- *in=0;
----------------------------------- *out = tube[0];
----------------------------------- printf("%s : entree :%d sortie %d\n", cmd[i][0], *in,*out);
----------------------------- }
----------------------------- else
----------------------------- {
----------------------------------- if(cmd[i+1]== NULL) // dernier
----------------------------------- {
----------------------------------------- puts("dernier");
----------------------------------------- *out=1;
----------------------------------------- *in = tube[1];
----------------------------------------- printf("%s : entree :%d sortie %d\n", cmd[i][0], *in, *out);
----------------------------------- }
----------------------------------- else
----------------------------------- {
----------------------------------------- puts("au milieu");
----------------------------------------- *in = tube[1];
----------------------------------------- pipe(tube);
----------------------------------------- printf("Tube créé : %d -> %d\n",tube[0],tube[1]);
----------------------------------------- *out = tube[0];
----------------------------------------- printf("%s : entree :%d sortie %d\n", cmd[i][0], *in, *out);
------------------------------------ }
----------------------------- }
----------------------------- if(lancer_commande(*in, *out, cmd[i][0], cmd[i])==-1)
----------------------------- {
------------------------------------ perror("lancer commande ");
----------------------------- }
------------------------}
----------------}

//-----Voila la fonction lancer commande a priori simple

int lancer_commande(int in, int out, char *com, char **argv)
{
int pid = fork();

if(pid==-1)
{
perror("fork");
return -1;
}
else if(pid ==0)
{
if(in!=0)
{
close(0);
dup(in);
}
if(out!=1)
{
close(1);
dup(out);
}

if(execvp(com,argv) ==-1 ) //<----- C'est ici que s'execute les commandes
{
perror("Commande ");
return -1;
}
return -1;
}
else if(pid >0) // processus père
{
return pid;
}
return pid;
}

/// enfin avec les printf je lance une execution

adi@adibuntu:~/home/adi/tp10 ls -l | grep o | wc -c
Tube créé : 3 -> 5
premier
ls : entree :0 sortie 3
au milieu
Tube créé : 6 -> 7
grep : entree :5 sortie 6
grep: (entrée standard): Mauvais descripteur de fichier
dernier
wc : entree :7 sortie 1
ls: erreur d'écriture: Mauvais descripteur de fichier
wc: entrée standard: Mauvais descripteur de fichier
0

adi@adibuntu:~/home/adi/tp10

on peut remarquer que les tubes sont a priori bien placé, mais les commande ne veulent pas les utiliser je ne sais pas pourquoi.... "int lancer-commande" est quasi identique a plein d'autre personne du groupe de tp.

Jaimerai beaucoup en finir avec ce tp qui me gache les vacances de noel.

Merci beaucoup

Joyeuses fetes

1 réponse

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
je vais peut être dire une connerie, mais il ne faut pas protéger ton pipe "|" si tu veux qu'il ne soit pas interpréter par le shell ??
test peut être le retour de la fonction "pîpe()" voir si elle s'exécute correctement.
D'après http://www.manpagez.com/man/2/pipe/
Il faut écrire sur le deuxième descripteur (tube [1]) et toi j'ai l'impression que tu fais l'inverse.
1