Mon programme mini-shell accepte la commande pipe, par exemple, ls -l | wc -l
et utilise excevp pour exécuter ces commandes.La fonction Tuyau dans le shell Linux est cochée C
Mon problème est qu'il n'y a pas de fork() pour execvp, la commande pipe fonctionne bien mais le shell se termine par la suite. S'il y a un fork() pour execvp, une boucle morte se produit. Et je ne peux pas le réparer.
code:
void run_pipe(char **args){
int ps[2];
pipe(ps);
pid_t pid = fork();
pid_t child_pid;
int child_status;
if(pid == 0){ // child process
close(1);
close(ps[0]);
dup2(ps[1], 1);
//e.g. cmd[0] = "ls", cmd[1] = "-l"
char ** cmd = split(args[index], " \t");
//if fork here, program cannot continue with infinite loop somewhere
if(fork()==0){
if (execvp(cmd[0],cmd)==-1){
printf("%s: Command not found.\n", args[0]);
}
}
wait(0);
}
else{ // parent process
close(0);
close(ps[1]);
dup2(ps[0],0);
//e.g. cmd[0] = "wc", cmd[1] = "-l"
char ** cmd = split(args[index+1], " \t");
//if fork here, program cannot continue with infinite loop somewhere
if(fork()==0){
if (execvp(cmd[0],cmd)==-1){
printf("%s: Command not found.\n", args[0]);
}
}
wait(0);
waitpid(pid, &child_status, 0);
}
}
Je sais fork() est nécessaire pour excevp afin de ne pas mettre fin au programme shell, mais je ne peux toujours pas le réparer. Toute aide sera appréciée, merci!
Comment devrais-je faire deux enfants en parallèle?
pid = fork();
if(pid == 0){
// child
} else{ // parent
pid1 = fork();
if(pid1 == 0){
// second child
} else // parent
}
est-ce correct?
Vous êtes 'fork()' deux fois. On ne sait pas ce que fait le premier enfant (parent du deuxième enfant) après le 'wait()' s pour son enfant, car il revient simplement de cette fonction. Postez plus de code ou expliquez pourquoi vous avez 'fork()' deux fois. – EOF
Notez que 'dup2()' ferme automatiquement le nouveau descripteur de fichier s'il est déjà ouvert, il n'est donc pas nécessaire de 'close()' ce FD d'abord. Il n'est pas faux de le faire si vous savez que FD doit être ouvert, mais en le fermant explicitement d'abord insère un appel de fonction supplémentaire dont vous devriez vérifier la valeur de retour. –