Semaphore sous unix

kamaldita -  
Kuku007 Messages postés 193 Statut Membre -
Bonjour,

j' ai ecrit un programme qui assure l'exclusion mutuelle de deux processus mais le probleme est que quand l'un deux execute sa section critique l'autre n'y entre pas du tt , merci de bien vouloir m'aider je vous en saurais tres reconnaissante

#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>

//l'operation qui decremente le semaphore
void P( int semid)
{
struct sembuf operation;
operation.sem_op = -1;
operation.sem_flg = 0;
semop (semid, &operation, 1);
}

//l'opération qui incremente le semaphore
void V(int semid)
{
struct sembuf operation;
operation.sem_op = 1;
operation.sem_flg = 0;
semop (semid, &operation, 1);
}

//le prog qu'effectue le pere
void msg1(int semid)
{
P(semid);
printf("Salut je suis le processus père \n");
sleep(3);
printf("C'est encore moi, le processus père \n");
V(semid);
}

void msg2(int semid)
{
P(semid);
printf("Salut je suis le processus fils \n");
sleep(3);
printf("C'est encore moi, le processus fils \n");
V(semid);
}

main( )
{
int semid;
int pid;
semid = semget(IPC_PRIVATE, 1, IPC_CREAT|IPC_EXCL|0666);
//if (semid == -1) {semid = semget (IPC_PRIVATE, 1, IPC_ALLOC|0666);}
semctl (semid, 0, SETVAL, 1);
pid=fork( );
if (pid == 0)
{

msg2(semid);

}
else
{

msg1(semid);

}
}

1 réponse

Kuku007 Messages postés 193 Statut Membre 23
 
Hum je ne pense pas avoir bien saisis la question :O

Reformules là ?
Il est évident que les 2 threads ne s'exécuteront pas en même temps vu l'usage d'un sémaphore.
Je me demande si j'ai bien compris la question ? :O

En tout cas ton code à l'air correct me semble-t-il (mon C commence à rouiller).
Soit le programme père prend la main soit le fils.
Le premier qui arrive à faire l'appel à la fonction dédiée obtient le sémaphore semid.
A partir de là il s'exécute normalement jusqu'à relâcher le sémaphore... Puis l'autre thread s'exécute.

A la lecture de ton code je me demande si avec tes appels "sleep()" tu n'essayes pas par hasard d'endormir le premier thread en espérant que le suivant prenne la main ???
0