Fork() et rands

Résolu/Fermé
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 - 10 déc. 2009 à 15:03
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 - 10 déc. 2009 à 15:53
Bonjour,
Voila mon problème, J'ai N processus qui s'exécutent en même temps. 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. Mon problème: Les rands sont identique pour tous les processus -_-'. Voici mon code:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/sem.h>
#include <time.h>
#include "sem.h"
#include <signal.h>
#define N 10
char *sem_boucher = "/tmp/boucher.sem";
char *sem_caisse = "/tmp/caisse.sem";
char *sem_entree = "/tmp/entree.sem";
char *sem_end = "/tmp/end.sem";
int n,i;
int pid [N];
void tue()
{
//assainer touts les processus;
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);
sem_create(sem_end, 0);
//obtention des semaphores;
semaphore boucher=sem_id(sem_boucher);
semaphore entree=sem_id(sem_entree);
semaphore caisse=sem_id(sem_caisse);
semaphore end=sem_id(sem_end);
//création des processus
int x;
for (i=1;i<=N;i++){
if ((pid[i]=fork())==0){
srand(time(NULL));
P(entree);
x=rand()%4;
printf("Le client %d attend %d seconde(s)\n",i,x);
sleep(x);
printf("le client %d entre par le tourniquet.\n",i);
V(entree);
x=rand()%2;
if (x==0){
P(boucher);
x=rand()%4;
printf("Le client %d attend %d seconde(s)\n",i,x);
sleep(x);
printf("le client %d va chez le boucher.\n",i);
V(boucher);
}
x=rand()%2;
if (x==0){
x=rand()%4;
printf("Le client %d attend %d seconde(s)\n",i,x);
sleep(x);
printf("le client %d prend des produits en acces libre\n",i);
}
P(caisse);
x=rand()%4;
printf("Le client %d attend %d seconde(s)\n",i,x);
sleep(x);
printf("le client %d passe a la caisse puis sort.\n",i);
V(caisse);
V(end);
exit(0);//on sort

}
}

for (i=1;i<=N;i++){
signal(SIGINT,tue); //On attend un ctrl+c
P(end);
}
}

2 réponses

dubcek Messages postés 18755 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 14 novembre 2024 5 621
10 déc. 2009 à 15:12
hello
il faudrait appeller srand avec des valeurs différentes, le pid par ex.
0
Piven Messages postés 81 Date d'inscription lundi 7 septembre 2009 Statut Membre Dernière intervention 27 février 2012 3
10 déc. 2009 à 15:53
Merci bien=)
0