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 10
- int 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
|