Concevoir une queue pour qu’elle soit une mémoire partagée

J’essaie de concevoir / implémenter une queue (circulaire) (en C) en tant que mémoire partagée afin qu’elle puisse être partagée entre plusieurs threads / processus.

La structure de la queue est la suivante:

typedef struct _q { int q_size; int q_front; int q_rear; int *q_data; }queue; 

Qui supporte les fonctions suivantes:

 int empty_q(queue *q); int display_q(queue *q); int create_q(queue **q, int size); int delete_q(queue **q); int enqueue(queue *q, int data); int dequeue(queue *q, int *data); 

Selon la taille de la queue mentionnée par l’utilisateur, la mémoire pour q_data sera allouée dans create_q ().

Question: Comment créer une mémoire partagée pour cette queue à l’aide des fonctions système fournies dans “sys / shm.h”? Tout extrait de code / exemple permettant de créer / attacher / récupérer / supprimer la mémoire partagée de la structure de données de la queue à l’aide de shmget (), shmat (), shmctl (), etc. serait d’une grande aide.

Quand je me suis planté avec Unix IPC, j’ai suivi le guide de Beej sur Unix IPC . Il y a même des blagues! Vous pouvez aller directement à la section de mémoire partagée . Des extraits de code expliquent chaque étape et un exemple complet à la fin.

Voici un exemple simple qui crée une mémoire partagée de la taille d’une structure, lui écrit des données et l’imprime. Exécutez une instance pour créer la mémoire partagée, y insérer des “données”, puis attendre une pression sur une touche. Exécutez une seconde instance dans une invite de commande différente et la seconde instance imprimera le contenu de la mémoire.

 typedef struct { char a[24]; int i; int j; } somestruct; void fillshm(int shmid) { somestruct *p; if ( (p = shmat (shmid, NULL, 0)) < 0 ) { perror("shmat"); exit(1); } printf("writing to shared memory\n"); strcpy(p->a, "my shared memory"); p->i = 123; p->j = 456; } void printshm(int shmid) { somestruct *p; if ( (p = shmat (shmid, NULL, 0)) < 0 ) { perror("shmat"); exit(1); } printf( "%s, %d, %d\n", p->a, p->i, p->j ); } int main( int argc, char *argv[] ) { int shmid; // see if the memory exists and print it if so if ( (shmid = shmget (1234, 0, 0)) >= 0 ) printshm( shmid ); else { // didn't exist, so create it if ( (shmid = shmget (1234, sizeof( somestruct ), IPC_CREAT | 0600)) < 0 ) { perror("shmget"); exit(1); } printf( "shmid = %d\n", shmid ); fillshm(shmid); printf( "Run another instance of this app to read the memory... (press a key): " ); getchar(); // delete it if ( shmctl (shmid, IPC_RMID, NULL) < 0 ) { perror("semctl"); exit(1); } } return 0; }