Files de messages

cs_spark01 Messages postés 11 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 23 janvier 2010 - 23 mars 2008 à 10:44
cs_spark01 Messages postés 11 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 23 janvier 2010 - 24 mars 2008 à 12:22
Bonjours



Je voudrai savoir si la taille d’une file de message est fixe ou dynamique  



Dans la taille augmente au nombre de message envoyer dans cette files





short msg_cbytes;     /* taille  de la file */<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>









cette instruction permet de fixer la taille de la fille









ou de donner la  taille actuelle de la file









et dans le cas ou j’ai plusieurs processus qui envoi des msg dans cette file









et un qui les récupère dois je  assurer l’exclusion mutuelle a cette fille









problème de producteur consommateur









ou la synchronisation est assurer par la structure des files des messages








merci d’avance

2 réponses

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
23 mars 2008 à 13:12
Yop,

Utilise les mutex et les semaphore, je cherche du coté des sem_create , mutex_create, sem_puts ,...

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
0
cs_spark01 Messages postés 11 Date d'inscription mercredi 2 janvier 2008 Statut Membre Dernière intervention 23 janvier 2010
24 mars 2008 à 12:22
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);

#include
#include <sys/time.h>
#include <sys/sem.h>
#include <signal.h>
#include <errno.h>
#include <stdio.h>

// 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 );
}

et voila un cours de Frédéric Lang : http://fr.lang.free.fr/cours/IPC_Csyst_v1.0.pdf
0
Rejoignez-nous