Voici le programme en C, si qq un peut me dire ou est l'erreur , je lui rendrais au paradis

//////////////////////////////////////Programme SEMAPH.////////////////////////////////////
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/types.h>
//création des sémaphores.
static struct sembuf operation_P={-1,-1,0},operation_V={-1,1,0};
/*************************************************************/
int sem_create ( int initval )
/* crée un ensemb e d'un seu sémaphore dont a c é est re iée à CLEF, de va eur initia e initva retourne 'identifiant associé au sémaphore si OK, sinon retourne -1 Si 'ensemb e associé à CLEF existe déjà , a fonction part en échec. Les droits sont positionnés de sorte que tout processus peut modifier le sémaphore */
{
int semid;
semid = semget ( IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | 0666);
if (semid == -1||semid == 0) return -1;
if (semctl(semid, 0, SETVAL, initval ) == -1) return -1;
return semid;
} /********************************************************/
int sem_delete ( int semid)
// supprime l'ensemble de sémaphores identifiés par semid
{
return semctl (semid , 0 , IPC_RMID , 0) ;
}
int P (int semid)
{
operation_P.sem_num=0;
return semop(semid,&operation_P,1);
}
int V (int semid)
{
operation_V.sem_num=0;
return semop(semid,&operation_V,1);
}
void sem_value(int semid)
{
printf("semaphore %d: %d\n",semid,semctl(semid,0,GETVAL,0));
}
main ()
{
int num_proc1,num_proc2,num_proc3,num_proc4,num_proc5,duree,i;
int s1,s2,s3=0; // sémaphores
s1=sem_create(1); //création des sémaphores
s2=sem_create(1);
s3=sem_create(1);
printf ("\n les etudiants font le trajet Brest-Rennes en train\n");
sleep (2);
printf ("\n les etudiants sont arrives a Rennes et se separent en 3 groupes\n");
V(s1);
V(s1);
V(s1);
sem_value(s1);
num_proc1 = fork () ; //REnnes-Lyon en voiture 1
num_proc2 = fork () ; //REnnes-Lyon en voiture 2
num_proc3 = fork () ; //REnnes-Grenoble en avion
num_proc4 = fork () ; //Lyon-Grenoble en bus
num_proc5 = fork () ; //Grenoble- Laplagne en bus
if (num_proc1 == 0) //Rennes-Lyon en voiture1
{
P(s1);
num_proc1 =1;
printf ("valeur du semaphore s1 apres depart voiture1:");
sem_value(s1);
printf ("\n les etudiants prennent la premiere voiture pour Lyon \n");
srand(time(NULL));//initialisation du generateur de chiffre aleatoire
duree = (rand() % 7) + 1;
printf(" dRLV1= %d\n",duree);
sleep (duree);
printf ("\n les etudiants V1 sont arrives à Lyon et attendent le bus pour Grenoble \n");
V(s2);
exit(1);
}
if (num_proc2 == 0) //Rennes-Lyon en voiture2
{
P(s1);
num_proc2 =1;
printf ("valeur du semaphore s1 apres depart voiture2:");
sem_value(s1);
printf ("\n les etudiants prennent la 2nd voiture pour Lyon \n");
srand(time(NULL));
duree = (rand() % 7) +1;
printf(" dRLV2= %d\n",duree);
sleep (duree);
printf ("\n les etudiants V2 sont arrivés à Lyon et attendent le bus pour Grenoble \n");
V(s2);
exit(2);
}
if (num_proc3 == 0) //Rennes-Grenoble en avion
{
P(s1);
num_proc3 =1;
printf ("valeur du semaphore s1 apres depart avion:");
sem_value(s1);
printf ("\n les etudiants prennent l'avion Rennes-Grenoble\n");
srand(time(NULL));
duree = (rand() % 6) + 1;
printf(" dRLA= %d\n",duree);
sleep (duree);
printf ("\n les etudiants A sont arrives à Grenoble et attendent le bus pour aller a la Plagne \n");
V(s3);
exit(3);
}
if (num_proc4 == 0) //Lyon-Grenoble en bus
{
P(s2);
P(s2);
num_proc4 =1;
printf ("\n les etudiants venus en voiture se rejoignent et prennent le bus Lyon-Grenoble\n");
srand(time(NULL));
duree = (rand() % 10) + 1;
printf(" dLGB= %d\n",duree);
sleep (duree);
printf ("\n les etudiants sont arrives a Grenoble rejoignent le groupe venu en avion et vont en bus à la Plagne \n");
V(s3);
sem_value(s1);
exit(4);
}
if (num_proc5 == 0) //Grenoble-Laplagne en bus
{
P(s3);
P(s3);
num_proc5 =1;
printf ("\n les etudiants vont en bus de Grenoble-Laplagne \n");
srand(time(NULL));
duree = (rand() % 5) + 1;
printf(" dGLB= %d\n",duree);
sleep (duree);
printf ("\n les etudiants sont arrives a Laplagne \n");
exit(5);
}
wait(1);
wait(2);
wait(3);
wait(4);
wait(5);
sem_delete(s1);
sem_delete(s2);
sem_delete(s3);
}
/////////////////////////////////fin Programme SEMAPH.////////////////////////////////////