cs_spark01
Messages postés11Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention23 janvier 2010
-
23 mars 2008 à 10:44
cs_spark01
Messages postés11Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention23 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
cs_spark01
Messages postés11Date d'inscriptionmercredi 2 janvier 2008StatutMembreDernière intervention23 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);
// 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 );
}