Enai
Messages postés1Date d'inscriptionsamedi 27 décembre 2008StatutMembreDernière intervention15 mai 2009
-
27 déc. 2008 à 11:08
ZMJUVENTINO
Messages postés41Date d'inscriptionvendredi 31 mars 2006StatutMembreDernière intervention11 mai 2009
-
15 mars 2009 à 14:20
Bonjour, j'ai un projet qui consiste à créer un mini Shell, je dois donc créer une succession de pipe en fonction du nombre de commande que j'entre. Pour le moment j'arrive à lancer 3 commandes successives mais à la 4° il me marque une erreur : "sortie standard: mauvais descripteur de fichier"
j'ai cherché toute la journée d'hier, essayant une multitude de choses différentes, au début j'avais essayé avec un seul pipe, et jme suis rendu compte qu'il fallait mieux un tableau de pipe !
J'ai une structure pour mes commandes :
Command{
char* command;
char** argv;
int nbarg;
int back;
...
struct Command *next;
}Command;
void exec(Command* cmd){
int nbCom=nbCommand(cmd);//récupère le nombre de commandes
int tube[nbCom-1][2];
int boolean=0;
pid_t pid;
int nbPipe=-1;//j'initialise l'indice du tableau de pipes à -1
int i;
switch(fork()){
case-1: printf("fork failed");break;
case 0 : /*fils*/
for(i=0; i<nbCom; i++){
if(pipe(tube[i])==-1){//créé le nombre de pipes nécessaires
printf("pipe failed");
}
}
while(cmd!=NULL){
switch(pid=fork()){
case -1: printf("fork failed");break;
case 0 : /*fils*/
if(boolean==1){/*modification de l'entrée*/
/*if(i>0){
close(tube[nbPipe-1][0]);
close(tube[nbPipe-1][1]);
}*/
close(tube[nbPipe][1]);
fclose(stdin);
dup2(tube[nbPipe][0], 0);
}else close(tube[nbPipe][0]);
if(cmd->next!=NULL){/*modification de la sortie*/
close(tube[nbPipe+1][0]);
fclose(stdout);
dup2(tube[nbPipe+1][1], 1);
}else close(tube[nbPipe+1][1]);
execv(cmd->command, cmd->argv);break;
default : /*père*/
close(tube[nbPipe][0]);
close(tube[nbPipe][1]);
break;
}
boolean=1;
cmd=cmd->next;//je passe à la commande suivante
nbPipe++;//j'incrémente l'indice du tableau de pipes
}
for(i=0; i<nbCom; i++){
wait();
}
break;
default : /*père*/
break;
}
if(!isBack(cmd)){
while(waitpid(0, 0, 0)<0);
}
}