[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 -
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
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
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.
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.