Page 1 sur 2

Sémaphore sous linux

Posté : dim. janv. 22, 2006 5:44 pm
par stringman
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 :P

//////////////////////////////////////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.////////////////////////////////////

Posté : dim. janv. 22, 2006 6:05 pm
par ori
farf pourra t'aider je pense =)

Posté : dim. janv. 22, 2006 7:39 pm
par Hébus
Les sémaphores ?
Les trucs en bleu marine sur les cargos qui gueulent "tonnere de brest" à tout bout de champ ?

:arrow:

Posté : dim. janv. 22, 2006 8:10 pm
par Calimsha
Si j'etais motivé, je t'aurai bien aidé.

Mais comme j'ai la flemme ...

Posté : lun. janv. 23, 2006 2:23 am
par Pavel
Olaf sors de ce corps!

Posté : lun. janv. 23, 2006 7:46 pm
par stringman
:roll: bon apparement ça vous inspire pas des masses tant pis je serais obligé de coucher avec mon prof d'algo pr avoir la solution!!!
@calim ça m'etonne pas t rien k'un petit branleur :P !!! en plus t'as meme pas tilté sur les wait....
:?

Posté : lun. janv. 23, 2006 7:49 pm
par ori
mme moi qui code pas en c je trouvais ca bizarre
calim t un branleur

Posté : lun. janv. 23, 2006 9:02 pm
par Hébus
Calim t un masturbateur ! :o

Posté : mar. janv. 24, 2006 12:34 am
par Farf
*Regarde le truc*
... gloups ! Ah ouais t'es comme ça toi ? :shock:
Ç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 :lol: )

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é... :lol:

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).

Posté : mar. janv. 24, 2006 8:52 am
par Kiko
oups je me suis trompé de topik :shock:

Posté : mer. févr. 01, 2006 11:57 pm
par Farf
Il est où Stringboy ? Qu'il me dise si mon truc a marché...

Posté : jeu. févr. 02, 2006 1:20 am
par Pavel
Daytaycay?

Posté : jeu. févr. 02, 2006 10:14 am
par Baalberith
Farf a écrit :Il est où Stringboy ? Qu'il me dise si mon truc a marché...
Regarde à l'autre bout de ton téléphone

Posté : jeu. févr. 02, 2006 7:55 pm
par Farf
Mon regard passe pas à travers le fil du téléphone... :P

Posté : jeu. févr. 02, 2006 11:13 pm
par Baalberith
Et en plus tu suxes