Communication entre fork()

Résolu
Piven Messages postés 81 Date d'inscription   Statut Membre Dernière intervention   -  
grou29 Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Voila mon problème, J'ai N processus qui s'exécutent en même; le programme s'arrête lorsque l'utilisateur presse ctrl+c . Mais je ne sais pas comment faire pour qu'il se termine également lorsque touts les processus ont finit de s'exécuter. Ce programme est pour m'entrainer avec les sémaphores et tester le librairie sem.h que je vient de terminer.Il simule l'activité d'un magasin comportant 1 entrée, 3 bouchers et 2 caisses. Voici mon code:

--------------------------------------------------magasin.c------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <time.h>
#include "sem.h"
#include <signal.h>
int N=10;
char *sem_boucher = "/tmp/boucher.sem";
char *sem_caisse = "/tmp/caisse.sem";
char *sem_entree = "/tmp/entree.sem";
int n,i;
int pid [10];
void tue(int)
{
//tuer touts les procossus;
for (i=1;i<=N;i++){
kill( pid[i], SIGKILL );
printf("\n");
exit(0);
}
}

main(){
//création des semaphores;
sem_create(sem_boucher,3);
sem_create(sem_caisse, 2);
sem_create(sem_entree, 1);
//obtention des semaphores;
semaphore boucher=sem_id(sem_boucher);
semaphore entree=sem_id(sem_entree);
semaphore caisse=sem_id(sem_caisse);
//création des processus
for (i=1;i<=N;i++){
if ((pid[i]=fork())==0){
P(entree);
sleep(rand()%4);
printf("le client %d entre par le tourniquet.\n",i);
V(entree);
P(boucher);
sleep(rand()%4);
printf("le client %d va chez le boucher.\n",i);
V(boucher);
sleep(rand()%4);
printf("le client %d prend des produits en acces libre\n",i);
P(caisse);
sleep(rand()%4);
printf("le client %d passe a la caisse puis sort.\n",i);
V(caisse);
exit(0);//on sort

}
}

while(1) signal(SIGINT,tue); //On attend un ctrl+c

}

2 réponses

Piven Messages postés 81 Date d'inscription   Statut Membre Dernière intervention   3
 
Need help!
0
grou29 Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   9
 
Une idée:

au debut:
sem_create(fini,0);

a la fin de chaque process (avant le exit()):
V(fini)

et a la place de ton while
for (i=1;i<=N;i++)
{
P(fini); //attend la fin d'un process
}
-
Grou29
http://lienssanslien.free.fr
0