merci
mais j'ai trouvé que la synchronisation est assurée par la file elle-même car lorsqu'un message est récupéré, il est automatiquement supprimé de la file
pour les semaphore
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
int semget(key_t key, int nsems, int semflg);
int semop(int semid, struct sembuf *sops, unsigned nsops);
int semctl(int semid, int semnum, int cmd, union semun arg);
La fonction semget() demande à travailler sur le sémaphore généralisé identifié par la clef key (cf. ci-dessus), et qui contient nsems sémaphores individuels. Un nouveau sémaphore est créé, avec les droits données par les 9 bits de poids faible de semflg, si key est IPC_PRIVATE, ou si semflg contient IPC_CREAT.
La fonction semop() agit sur le sémaphore semid en appliquant simultanément à plusieurs sémaphores individuels les actions décrites dans les nsops premiers éléments du tableau sops.
struct sembuf {
...
short sem_num;
short sem_op;
short sem_flg;
}
sem_num est le numéro du sémaphore individuel sur lequel porte l'opération
sem_op est un entier destiné (sauf s'il est nul) à être ajouté à la valeur courante semval du sémaphore. L'opération se bloque si sem_op + semval < 0. Cas particulier : si sem_op est 0, l'opération est bloquée tant que semval est non nul. Rq : les valeurs des sémaphores ne sont mises à jour que lorsqu'aucun d'eux n'est bloqué.
La fonction semctl permet de réaliser diverses opérations sur les sémaphores, selon la commande demandée. En particulier, on peut fixer le n-ième sémaphore à la valeur val en faisant semctl(sem, n, SETVAL, val);
// Opération V ( +1 ) sur le 1er sémaphore de l'ensemble d'id sem.
void V( int sem )
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = 0;
// printf("< V(%d) dans pid %d . \n", sem, getpid() );
semop( sem, &buf, 1 );
// printf("V(%d) dans pid %d. > \n", sem, getpid() );
}
// Opération P ( -1 ) sur le 1er sémaphore de l'ensemble d'id sem.
void P( int sem )
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = 0;
// printf("< P(%d) dans pid %d . \n", sem, getpid() );
semop( sem, &buf, 1 );
// printf("P(%d) dans pid %d. > \n", sem, getpid() );
}
int new_semaphore( char id )
{
int _id, err;
// printf("semaphore %d en création.\n", id );
_id = semget( ftok( ".", id ), 1, IPC_CREAT | IPC_EXCL | 0777 );
if ( _id == -1 )
{
printf("semget id : %c.\n", id );
perror( "semget()" );
exit( -1 );
return -1;
}
err = semctl( _id, 0, SETVAL, 1 );
if ( err == -1 )
{
perror( "semclt(SETVAL)" );
exit( -1 );
return -1;
}
// printf("semaphore %d crée ->%d \n", id, _id );
return _id;
}
// détruit l'ensemble de sémaphores identifié par sema.
void kill_semaphore( int sema )
{
// printf("kill semaphore %d.\n", sema );
semctl( sema, 0, IPC_RMID, NULL );
}