Synchroniser les processus

Fermé
lila92 - 17 nov. 2014 à 23:10
salut tout le monde j'ai un probleme avec le signal <wait > pour la synchronisation du processus père, j'ai créer mon Tp avec le langage C , l'idée c'est que le pere va reveiller touts ses fils avec un sémaphore ( j'ai un seul processus pere et les autres des fils ) donc il doit attendre l'exécution de ses fils aprés il s'exécute mais ici se trouve le probleme quand j'utilise le signal sleep(1) ça marche trés bien mais avec le signal wait() ça marche pas . lorsque j'utilise le wait le pere attend infiniment !!!!!! et le prof a exiger l'utilisation du wait :/ alors svp si vous avez une idée aidez moi !!! merciiii
voila mon code source

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#include<sys/wait.h>
///***************FONCTION p********************************///
int p(int semid)
{
struct sembuf sempar;
sempar.sem_num=0;
sempar.sem_op=-1;
sempar.sem_flg=SEM_UNDO;
return semop(semid,&sempar,1);
}
///***************FONCTION v********************************///
int v(int semid)
{
struct sembuf sempar;
sempar.sem_num=0;
sempar.sem_op=1;
sempar.sem_flg=SEM_UNDO;
return semop(semid,&sempar,1);
}
/************************************************MAIN********************************************************/
main()
{
printf("\t\t********************BOUZIDI LEILA************************\t \t \n");
printf("*************************Tp n=1 Système distribué*************************\t\n");
int pid=1,i=0,n,sf,x;
// pid t wait;
sf=semget(IPC_PRIVATE,1,IPC_CREAT|0666);
semctl(sf,0,SETVAL,0);
printf("\nDONNEZ LE NOMBRE DE PROCESSUS QUE VOUS VOULEZ UTILISE DANS VOTRE TEST \n");
printf(" \n LE NOMBRE DE PROCESSUS EST:");
scanf("%d",&n);
while(pid!=0 && i<(n-1)) //pour la creation des processus
{
pid=fork();
if(pid==-1)
{
printf("erreur de création");
}

if(pid==0) ///c'est le processus fils
{
if (i<(n-1)) //pour tester
{
printf("je suis le fils numéro %d MON PID EST %d je suis bloqué mon père est===> %d \n",i,getpid(),getppid());
p(sf); //se bloquer
printf("je suis le fils numero %d MON PID EST %d maintenant je suis <<ACTIF>>!!!\n",i,getpid());
exit(0);
}
}

i++;

}///FIN DE BOUCLE

if (pid>0) //**ici c'est le processus pere**//
{
// sleep(2);
//
wait(& pid);
printf("<<je suis le pere <<<JE SUIS ACTIF>>>,mon numero est %d,voila mon identifiant ====>%d>>\n",i, getpid());
printf(" le pid est %d",pid);
for(i=0;i<n;i++)
{
v(sf);//réveiller les processus bloqués
}



}
}
///~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FIN~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//