salut
Je suis en train d'ecrire un shell tout con, qui est cense gerer le &.
Le probleme est que lorsque j'ecris par exemple pwd & sur la ligne de
commande, ca a l'air de marcher, mais quand je fais de suite apres un
pwd sans le &, le pere n'attend pas le fils. Je vous met a disposition
mon code. Si vous pouvez me dire ce qui cloche:
void vide_buffer() {
int c ;
while ((c = getchar()) != '\n') {
}
}
int main(int argc, char* argv[])
{
char ligne[MAXLIGNE] ;
char* listecom[100] ;
char* p ; /* pour strchr */
int et_vrai ;
while (1) {
char* pc ; /* pour strtok */
int i = 0 ;
int ret ; /* retour de fork */
int status ;
et_vrai = 0 ;
(void) printf("> ") ;
fflush(stdout) ;
if (saisir_ligne(ligne) == -1) {
(void) fprintf(stderr, "erreur de saisi de la ligne\n") ;
return EXIT_FAILURE ;
}
p = strchr(ligne, '\n') ;
if (p == NULL) {
(void) fprintf(stderr, "erreur: chaine trop longue\n") ;
vide_buffer() ;
}
else {
*p = '\0' ; /* on remplace le \n trouve par NULL */
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Stephane Chazelas
2004-01-10, 10:43(+01), did:
Je suis en train d'ecrire un shell tout con, qui est cense gerer le &. Le probleme est que lorsque j'ecris par exemple pwd & sur la ligne de commande, ca a l'air de marcher, mais quand je fais de suite apres un pwd sans le &, le pere n'attend pas le fils. [...]
Utilise waitpid au lieu de wait. wait attend jusqu'à ce que n'importe quel fils se termine, pas forcément celui que tu viens de lancer.
Si tu fais
pwd & puis pwd
Le wait pour le deuxième "pwd" retourne immédiatement pour rapporter la terminaison du premier "pwd".
Je suis en train d'ecrire un shell tout con, qui est cense gerer le &.
Le probleme est que lorsque j'ecris par exemple pwd & sur la ligne de
commande, ca a l'air de marcher, mais quand je fais de suite apres un
pwd sans le &, le pere n'attend pas le fils.
[...]
Utilise waitpid au lieu de wait. wait attend jusqu'à ce que
n'importe quel fils se termine, pas forcément celui que tu viens
de lancer.
Si tu fais
pwd &
puis
pwd
Le wait pour le deuxième "pwd" retourne immédiatement pour
rapporter la terminaison du premier "pwd".
Je suis en train d'ecrire un shell tout con, qui est cense gerer le &. Le probleme est que lorsque j'ecris par exemple pwd & sur la ligne de commande, ca a l'air de marcher, mais quand je fais de suite apres un pwd sans le &, le pere n'attend pas le fils. [...]
Utilise waitpid au lieu de wait. wait attend jusqu'à ce que n'importe quel fils se termine, pas forcément celui que tu viens de lancer.
Si tu fais
pwd & puis pwd
Le wait pour le deuxième "pwd" retourne immédiatement pour rapporter la terminaison du premier "pwd".
Le retour du fork() dans le pere est le pid du fils
did
Mat Free wrote:
Le retour du fork() dans le pere est le pid du fils
Le probleme, c'est que vu que fork renvoie 0 quand on est dans le fils,
et une valeur > 0 quand on est dans le pere, je vois vraiment pas comment on peut s'en sortir avec waitpid en utilisant ce resultat. En gros, j'ai fait: if (res > 0) { if (NON_ET) { waitpid(res, &status, WNOHANG) ; } }
Mais bon, sans convictions :'(
Mat Free wrote:
Le retour du fork() dans le pere est le pid du fils
Le probleme, c'est que vu que fork renvoie 0 quand on est dans le fils,
et une valeur > 0 quand on est dans le pere, je vois vraiment pas
comment on peut s'en sortir avec waitpid en utilisant ce resultat.
En gros, j'ai fait:
if (res > 0) {
if (NON_ET) {
waitpid(res, &status, WNOHANG) ;
}
}
Le retour du fork() dans le pere est le pid du fils
Le probleme, c'est que vu que fork renvoie 0 quand on est dans le fils,
et une valeur > 0 quand on est dans le pere, je vois vraiment pas comment on peut s'en sortir avec waitpid en utilisant ce resultat. En gros, j'ai fait: if (res > 0) { if (NON_ET) { waitpid(res, &status, WNOHANG) ; } }
Mais bon, sans convictions :'(
Mat Free
En gros, j'ai fait: if (res > 0) { if (NON_ET) { waitpid(res, &status, WNOHANG) ; } }
Mais bon, sans convictions :'(
Pour faire propre
switch(ret=fork()) { case -1 : fprintf(stderr,"Erreur de forkn"); exit(1);
case 0 : printf("Chez le filsn"); exit(1);
default : /* chez le pere */ }
/* Chez le pere (puisque le fils a fait un exit) */
/* Attend la fin du fils pour continuer le traitement */ waitpid(ret, ...);
En gros, j'ai fait:
if (res > 0) {
if (NON_ET) {
waitpid(res, &status, WNOHANG) ;
}
}
Mais bon, sans convictions :'(
Pour faire propre
switch(ret=fork())
{
case -1 : fprintf(stderr,"Erreur de forkn"); exit(1);
case 0 : printf("Chez le filsn");
exit(1);
default : /* chez le pere */
}
/* Chez le pere (puisque le fils a fait un exit) */
/* Attend la fin du fils pour continuer le traitement */
waitpid(ret, ...);