Programme qui ne se ferme pas a la fin
encoremoi
-
encoremoi -
encoremoi -
Bonjour,
j'ai écrit un programma, il fait ce qu'il faut, mais a la fin, il ne se ferme pas... comment faire pour le terminer ,
j'ai un programme qui demande en boucle une saisie de nombre, et les envoie au fur et a mesure a un 2nd programme qui les affiche... jusqu'a ce que j'écrive 0.
quand j'envoie 0, les 2 programmes ferment le pipe qui leur sert a communiquer, et chacun faitexit(-1) qui devrait cloturer chaque programme... mais ca ne cloture rien du tout.
Voici mon code:
prog1:
prog2 :
Si vous pouviez me dire ce qui bloque...
merci !
j'ai écrit un programma, il fait ce qu'il faut, mais a la fin, il ne se ferme pas... comment faire pour le terminer ,
j'ai un programme qui demande en boucle une saisie de nombre, et les envoie au fur et a mesure a un 2nd programme qui les affiche... jusqu'a ce que j'écrive 0.
quand j'envoie 0, les 2 programmes ferment le pipe qui leur sert a communiquer, et chacun faitexit(-1) qui devrait cloturer chaque programme... mais ca ne cloture rien du tout.
Voici mon code:
prog1:
int main(void)
{
int dp,pid;
int nb=3;
unlink("pipe");
mkfifo("pipe",0666);
pid=fork();
if (pid==0)
execv("exopipe2",NULL);
dp=open("pipe",O_WRONLY);
if (dp==0) erreur("pb d'ouverture de pipe\n");
while(nb!=0)
{
//sleep(100);
printf("taper le nombre\n");
scanf("%d",&nb);
write(dp,&nb,sizeof(int));
kill(pid,SIGUSR1);
}
sleep(100);
close(dp);
exit(-1);
}
void erreur(char *mes)
{
perror(mes);
exit(-1);
}
prog2 :
void erreur(char *mes);
void ferme(void);
void lecture(int sig);
int dp;
int main(void)
{
dp=open("pipe",O_RDONLY);
if (dp==0) erreur("pb d'ouverture de pipe\n");
signal(SIGUSR1,lecture);
for(;;)
pause();
}
void lecture(int sig)
{
int result,re;
re=read(dp,&result,sizeof(result));
if (re==0) erreur("pb de lecture\n");
if(result!=0)
printf("le resultat est %d\n",result);
else
ferme();
}
void ferme(void)
{
close(dp);
exit(-1);
}
void erreur(char *mes)
{
perror(mes);
exit(-1);
}
Si vous pouviez me dire ce qui bloque...
merci !
2 réponses
-
Eh oui, c'est encore moi!
Bon, il faudrait bien potasser le sujet avant de se lancer dans la passionnante aventure des 'fork' !
Le programme ne peut se terminer tant que le code de retour du fils n'a pas été lu; d'autre part avec 'execv', je me demande s'il ne faut pas demander au processus de terminer; j'essairai donc de rajouter:kill (pid, SIGTERM); wait(NULL); close(dp); return(0);
Mettre plutôt un return(0) qu'un exit(-1) qui signifie une erreur; d'autre part on réserve la sortie du programme par exit'' dans les fonctions (un return ne fait pas sortir du programme).
Bon vent. -
Merci loupius !
Effectivement, avec sigterm, ca marche.
J'ai essayé une autre méthode aussi , dans le prog2 : je met une condition dans ma bouclefor(;;) { if (fin==0) pause(); else close(dp); return(0); }
avec fin un booléen qui j'incremente quand je recois le chiffre 0.
Ca donne le meme resultat que sigterm