| Giz | ...bien et maintenant voici le code (dont j'ai vire quelques les commentaires pour faire court et les test d'erreurs)
 
 shm_create.c :
 
 | Code : 
 #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include "queue_limited.h"#if defined(__GNU_LIBRARY__) && !defined(_SEM_SEMUN_UNDEFINED)/* l'union semun est définie par l'inclusion de <sys/sem.h> */#else/* d'après X/OPEN il faut la définir nous-mêmes */union semun {      int val;                  /* valeur pour SETVAL */      struct semid_ds *buf;     /* buffer pour IPC_STAT, IPC_SET */      unsigned short *array;    /* table  pour GETALL, SETALL */                                /* Spécificité Linux : */      struct seminfo *__buf;    /* buffer pour IPC_INFO */};#endif//taille d'un element dans la file de message en shm
#define SIZE_ELT (sizeof (int))//nombre d'element max que peut contenir la file dans la shm
#define NB_ELT 10int main (){	key_t key;	int shm_id, sem_id, i;	union semun arg;	QueueLimited *fifo;	printf ("creation : creation de la zone de memoire partagee...\n" );	//generation d'une cle secrete pour identifier la zone de memoire partagee
	key = ftok ("./shm_main.c", 987654321)	shm_id = shmget (key, NB_ELT * SIZE_ELT + sizeof (QueueLimited), IPC_CREAT | IPC_EXCL | 0666)	printf ("creation : creation de l'ensemble des semaphores...\n" );	//generation d'une cle secrete pour identifier l'ensemble de semaphores
	key = ftok ("./shm_main.c", 876543210)	sem_id = semget (key, 4, IPC_CREAT | IPC_EXCL | 0666)	//parametrage de chaque semaphore avec leur valeur initiale
	arg.val = 1;	semctl (sem_id, 0, SETVAL, arg)	arg.val = 1;	semctl (sem_id, 1, SETVAL, arg)	arg.val = NB_ELT;	semctl (sem_id, 2, SETVAL, arg)	arg.val = 0;	semctl (sem_id, 3, SETVAL, arg)	//initialisation de la structure QueueLimited dans la shm
	fifo = (QueueLimited *) shmat (shm_id, NULL, 0)	printf ("creation : je suis attache au segment shm d'adresse %#x...\n", fifo );	for (i = 0; i < 15; i++)  printf ("creation : contenu de la shm : %#x, adresse %#x\n", *((int *) fifo + i), (int *) fifo + i);	printf ("creation : initialisation de la structure QueueLimited dans la shm...\n" );	fifo->elements	= (char *) fifo + sizeof (QueueLimited);	printf ("creation : fifo->elements = %#x\n", fifo->elements);	fifo->head  = (char *) fifo + sizeof (QueueLimited);	printf ("creation : fifo->head = %#x\n", fifo->head);	fifo->end  = (char *) fifo + sizeof (QueueLimited);	printf ("creation : fifo->end = %#x\n", fifo->end);	fifo->max  = (char *) fifo + sizeof (QueueLimited) + NB_ELT * SIZE_ELT;	printf ("creation : fifo->max = %#x\n", fifo->max);	fifo->size_elt	= SIZE_ELT;	printf ("creation : fifo->size_elt = %d\n", fifo->size_elt);	for (i = 0; i < 15; i++)  printf ("creation : contenu de la shm : %#x, adresse %#x\n", *((int *) fifo + i), (int *) fifo + i);	//detachement du processus de la shm
	shmdt (fifo)	printf ("creation : je me suis detache du segment shm %#x...\n", (int) fifo);	return 0;}
 | 
 
 le programme de shm_prod2.c :
 
 
 | Code : 
 #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <time.h>#include "queue_limited.h"int main (){	key_t key;	int shm_id, sem_id, to_send, i;	struct sembuf prendre[2] = {{2, -1, 0}, {1, -1, 0}};	struct sembuf vendre[2]  = {{1, 1, 0}, {3, 1, 0}};	QueueLimited *fifo;	//generation d'une cle secrete pour identifier la zone de memoire partagee
	key = ftok ("./shm_main.c", 987654321)	shm_id = shmget (key, 1, IPC_CREAT)	//attachement du processus a la shm
	fifo = (QueueLimited *) shmat (shm_id, NULL, 0)	printf ("producteur 2 : je suis attache au segment shm d'adresse %#x...\n", fifo);	printf ("producteur 2 : fifo->elements = %#x\n", fifo->elements);	printf ("producteur 2 : fifo->head = %#x\n", fifo->head);	printf ("producteur 2 : fifo->end = %#x\n", fifo->end);	printf ("producteur 2 : fifo->max = %#x\n", fifo->max);	printf ("producteur 2 : fifo->size_elt = %d\n", fifo->size_elt);	for (i = 0; i < 15; i++)  printf ("producteur 2 : contenu de la shm : %#x\n", *((int *) fifo + i));	//generation d'une cle secrete pour identifier l'ensemble de semaphores
	key = ftok ("./shm_main.c", 876543210))	sem_id = semget (key, 0, IPC_CREAT)	/*
  * depot dans la file FIFO et operation sur les semaphores
  */	srand (time (0));	while (1)	{  //valeur a deposer
  to_send = rand () % 100;  semop (sem_id, &prendre[0], 2)  /*
   *  	*** ZONE CRITIQUE ***
   */  //gestion de facon circulaire de la FIFO
  if (fifo->end == fifo->max)  	fifo->end = fifo->elements;  //insertion de la valeur dans la fifo
  *((int *) fifo->end) = to_send;  printf ("producteur 2 : je suis en zone critique : depot de %d a l'adresse : %#x\n", *((int *) fifo->end), fifo->end);  for (i = 0; i < 15; i++)  	printf ("producteur 2 : contenu de la shm : %#x, adresse : %#x\n", *((int *) fifo + i), (int *) fifo + i);  //avancement du pointeur "end"
  fifo->end = (char *) fifo->end + fifo->size_elt;  /*
   *  	*** FIN ZONE CRITIQUE ***
   */  semop (sem_id, &vendre[0], 2)  sleep (1);	}	return 0;}
 | 
 
 la structure QueueLimited :
 
 | Code : 
 typedef struct{	void *elements;  //elements de la file
	void *head;  	//prochaine valeur a extraire
	void *end;  	//prochaine valeur a ajouter
	void *max;  	//taille max de la file
	size_t size_elt;	//taille des elements dans la file
}QueueLimited;
 | 
 
 voila tout
    Message édité par Giz le 25-02-2004 à 14:00:41
 |