Semaphore sous unix
kamaldita
-
Kuku007 Messages postés 193 Statut Membre -
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);
}
}
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
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 ???
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 ???