Communication entre fork()

Résolu/Fermé
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 - 9 déc. 2009 à 20:45
grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 - 10 déc. 2009 à 00:54
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 lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 3
9 déc. 2009 à 20:52
Need help!
0
grou29 Messages postés 39 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 19 mai 2010 9
10 déc. 2009 à 00:54
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