Sémaphore sous linux

Les esclaves de la machine. Les vrais.
Avatar de l’utilisateur
stringman
~ ectoplasme de blob ~
~ ectoplasme de blob ~
Messages :26
Inscription :mer. sept. 01, 2004 2:49 pm
Sémaphore sous linux

Message par stringman » dim. janv. 22, 2006 5:44 pm

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

Avatar de l’utilisateur
ori
master of ghoul
master of ghoul
Messages :6435
Inscription :ven. mars 26, 2004 4:23 pm
Localisation :I saw a radscorpion yesterday. AHHH !! Disgusting creature !

Message par ori » dim. janv. 22, 2006 6:05 pm

farf pourra t'aider je pense =)

Avatar de l’utilisateur
Hébus
master of ghoul
master of ghoul
Messages :4898
Inscription :sam. mars 27, 2004 6:04 pm

Message par Hébus » dim. janv. 22, 2006 7:39 pm

Les sémaphores ?
Les trucs en bleu marine sur les cargos qui gueulent "tonnere de brest" à tout bout de champ ?

:arrow:
GOVOU L'ENVOIE EN L'AIR, BENZEMA L'A­ RETOURNE, RIBERY TIRE : ET PUUUTE !

Avatar de l’utilisateur
Calimsha
Ø gougoule d'élite Ø
Ø gougoule d'élite Ø
Messages :2073
Inscription :ven. mars 26, 2004 6:29 pm
Localisation :R'lyeh, la sombre, la ténèbreuse, la daaark
Contact :

Message par Calimsha » dim. janv. 22, 2006 8:10 pm

Si j'etais motivé, je t'aurai bien aidé.

Mais comme j'ai la flemme ...
Tractopelle rhétorique déclarée d'utilité publique. Mange des enfants, tue des bébés phoques, maltraite les tentacules à couettes (et vote à droite).

Avatar de l’utilisateur
Pavel
Ø gougoule d'élite Ø
Ø gougoule d'élite Ø
Messages :2235
Inscription :mar. mai 25, 2004 2:29 pm
Localisation :Sora ni...

Message par Pavel » lun. janv. 23, 2006 2:23 am

Olaf sors de ce corps!
Image

Avatar de l’utilisateur
stringman
~ ectoplasme de blob ~
~ ectoplasme de blob ~
Messages :26
Inscription :mer. sept. 01, 2004 2:49 pm

Message par stringman » lun. janv. 23, 2006 7:46 pm

: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....
:?

Avatar de l’utilisateur
ori
master of ghoul
master of ghoul
Messages :6435
Inscription :ven. mars 26, 2004 4:23 pm
Localisation :I saw a radscorpion yesterday. AHHH !! Disgusting creature !

Message par ori » lun. janv. 23, 2006 7:49 pm

mme moi qui code pas en c je trouvais ca bizarre
calim t un branleur

Avatar de l’utilisateur
Hébus
master of ghoul
master of ghoul
Messages :4898
Inscription :sam. mars 27, 2004 6:04 pm

Message par Hébus » lun. janv. 23, 2006 9:02 pm

Calim t un masturbateur ! :o
GOVOU L'ENVOIE EN L'AIR, BENZEMA L'A­ RETOURNE, RIBERY TIRE : ET PUUUTE !

Avatar de l’utilisateur
Farf
~ Griffemort en rut ~
~ 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 :

Message par Farf » mar. janv. 24, 2006 12:34 am

*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).
Grande vérité : "les gens normaux n'ont rien d'exceptionnel."

Avatar de l’utilisateur
Kiko
suceur de zan
suceur de zan
Messages :403
Inscription :dim. mars 28, 2004 2:04 pm

Message par Kiko » mar. janv. 24, 2006 8:52 am

oups je me suis trompé de topik :shock:

Avatar de l’utilisateur
Farf
~ Griffemort en rut ~
~ 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 :

Message par Farf » mer. févr. 01, 2006 11:57 pm

Il est où Stringboy ? Qu'il me dise si mon truc a marché...
Grande vérité : "les gens normaux n'ont rien d'exceptionnel."

Avatar de l’utilisateur
Pavel
Ø gougoule d'élite Ø
Ø gougoule d'élite Ø
Messages :2235
Inscription :mar. mai 25, 2004 2:29 pm
Localisation :Sora ni...

Message par Pavel » jeu. févr. 02, 2006 1:20 am

Daytaycay?
Image

Avatar de l’utilisateur
Baalberith
~ Mort ambulante ~
~ Mort ambulante ~
Messages :449
Inscription :ven. juin 11, 2004 8:45 am
Contact :

Message par Baalberith » jeu. févr. 02, 2006 10:14 am

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

Avatar de l’utilisateur
Farf
~ Griffemort en rut ~
~ 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 :

Message par Farf » jeu. févr. 02, 2006 7:55 pm

Mon regard passe pas à travers le fil du téléphone... :P
Grande vérité : "les gens normaux n'ont rien d'exceptionnel."

Avatar de l’utilisateur
Baalberith
~ Mort ambulante ~
~ Mort ambulante ~
Messages :449
Inscription :ven. juin 11, 2004 8:45 am
Contact :

Message par Baalberith » jeu. févr. 02, 2006 11:13 pm

Et en plus tu suxes

Répondre