Sémaphore sous linux
SAlut à tous, je galere sur un TP linux avec les semaphiores. Mon programme fait des boucles lors de l'execution des porcessus fils et je dois avouer ke je comprends pas.....
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.////////////////////////////////////
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.////////////////////////////////////
-
- ~ Griffemort en rut ~
- Messages :883
- Inscription :ven. mars 26, 2004 4:57 pm
- Localisation :Si ça ne tenait qu'à moi, dans le coin le plus paumé possible...
- Contact :
*Regarde le truc*
... gloups ! Ah ouais t'es comme ça toi ?
Ça fait super longtemps que j'ai pas touché les sémaphores...
*Après une petite demi-douzaine de minutes*
Est-ce que tu devrais pas initialiser tes membres 'sem_num' à semid au lieu de 0 à la première ligne de tes fonctions P et V ? (j'adore tes noms de fonctions, cela dit en passant )
Sinon, à part ça, je vois pas trop... faut dire que voir quelque chose dans les sémaphores linux alors qu'on fait des wait et signal à coups de "semop (sembuf(-1,-1,0))", c'est pas gagné...
Si c'est pas ça, essaie de tracer dans tes segments de code 'fils' pour voir exactement où ils bouclent (genre un print après chaque instruction, tu t'aperçois vite d'où est l'erreur).
... gloups ! Ah ouais t'es comme ça toi ?
Ça fait super longtemps que j'ai pas touché les sémaphores...
*Après une petite demi-douzaine de minutes*
Est-ce que tu devrais pas initialiser tes membres 'sem_num' à semid au lieu de 0 à la première ligne de tes fonctions P et V ? (j'adore tes noms de fonctions, cela dit en passant )
Sinon, à part ça, je vois pas trop... faut dire que voir quelque chose dans les sémaphores linux alors qu'on fait des wait et signal à coups de "semop (sembuf(-1,-1,0))", c'est pas gagné...
Si c'est pas ça, essaie de tracer dans tes segments de code 'fils' pour voir exactement où ils bouclent (genre un print après chaque instruction, tu t'aperçois vite d'où est l'erreur).
Grande vérité : "les gens normaux n'ont rien d'exceptionnel."
-
- ~ Mort ambulante ~
- Messages :449
- Inscription :ven. juin 11, 2004 8:45 am
- Contact :
-
- ~ Mort ambulante ~
- Messages :449
- Inscription :ven. juin 11, 2004 8:45 am
- Contact :