Programme qui ne se ferme pas a la fin

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:
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 !
A voir également:

2 réponses

loipius
 
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.
0
encoremoi
 
Merci loupius !

Effectivement, avec sigterm, ca marche.
J'ai essayé une autre méthode aussi , dans le prog2 : je met une condition dans ma boucle
for(;;)
{
   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
0