Executer une commande en a shell arriere plan
Bonjour,
je doit créer un mini shell et une question me pose soucis. Voilà mon énoncé :
Le shell va maintenant gérer les commandes en arrière-plan. Dans ce cas,
le shell n’attend pas la fin de la commande mais "continue" en permettant la
saisie d’une nouvelle commande. Cependant, il faut également gérer la fin des
processus lancés en arrière-plan. Lorsqu’un processus se termine, le signal
SIGCHLD est envoyé à son père : il faudra donc le gérer correctement de manière
à éliminer les processus zombies. Indice : waitpid(2).
Pour les commandes lancés en arrière-plan, si l’entrée standard n’est pas
redirigée vers un fichier, il faudra la rediriger vers le fichier /dev/null.
j'ai déjà créé un handler pour mon Sigchld qui s'occupe de terminer un programme dès qu'il est fini. Mais mon soucis c'est de lancer le programme en arrière plan c'est-à-dire quand je fais exevp d'une commande la lancer en arrière plan et que mon mini-shell continue a bosser sur une autre commande.
Code:
1 2 3 4 5 6 7 8 9 10 11
|
void handSIGCHLD (int sig){
pid_t pid = getpid();
int status;
fprintf(stderr,"hello");
if ((pid = wait(&status)) == -1){ /* suppression du fils zombi */
perror("wait handler ");
return ;
}
return;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| struct sigaction action_termine;
sigemptyset(&action_termine.sa_mask);
action_termine.sa_handler= handSIGCHLD;
sigaction(SIGCHLD,&action_termine,NULL);
execvp(li.cmds[i].args[0],li.cmds[i].args);
fprintf(stderr, "ERROR !\nCommand %s: not exist !\n",li.cmds[i].args[0] );
perror(li.cmds[i].args[0]);
line_reset(&li);
exit(1);
}else if (pID < 0){
line_reset(&li);
perror("fork");
exit(1);
}//sigchl wiat pid en question tache finies
wait(&status);
if(WIFEXITED (status)){
fprintf (stderr, "Child over usally: status = %d\n",WEXITSTATUS (status)) ;
} else if (WIFSIGNALED (status)){
fprintf(stderr, "Child over with a signal\n");
}
fprintf(stderr, "\n");
} |