2011-12-12 7 views
7

Estoy intentando diseñar/implementar una cola (circular) (en C) como una memoria compartida para que pueda compartirse entre múltiples hilos/procesos.Diseñar una cola para que sea una memoria compartida

La estructura de colas es como sigue:

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

que soporta las siguientes funciones:

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

Según el tamaño de la cola por parte del usuario, la memoria para q_data se asignarán en create_q().

Pregunta: ¿Cómo crear una memoria compartida para esta cola usando las funciones del sistema proporcionadas en "sys/shm.h"? Cualquier fragmento de código/ejemplo para crear/adjuntar/recuperar/eliminar memoria compartida para la estructura de datos de la cola usando shmget(), shmat(), shmctl(), etc. sería de gran ayuda.

+0

Si desea comunicar procesos utilizando un mecanismo similar a una cola, ¿no sería mejor utilizar [colas de mensajes] (http://www.it.uom.gr/teaching/c_marshall/node25.html)? A través de subprocesos del mismo proceso, una cola estándar protegida por una sección crítica sería suficiente –

+0

@dario_ramos las colas de mensajes serían una solución ideal para este problema ... pero estoy tratando de dar un ejemplo utilizando una cola para averiguar cómo adjuntar una estructura de datos con una memoria compartida. –

+0

En ese caso, cuando me metí con Unix IPC, seguí [la guía de Beej para Unix IPC] (http://beej.us/guide/bgipc/). ¡Incluso tiene algunas bromas! Puede ir directamente a la [sección de memoria compartida] (http://beej.us/guide/bgipc/output/html/multipage/shm.html) –

Respuesta

2

Cuando ensuciado con Unix IPC, he seguido Beej's guide to Unix IPC. ¡Incluso tiene algunas bromas! Puede ir directamente al shared memory section. Tiene fragmentos que explican cada paso y un ejemplo completo al final.

+0

La guía de Beej es increíble. Gracias por compartir. :) –

+0

Mencioné esto también .. información relativamente buena. –

+0

Parece una referencia más detallada, buena para ti. Un pequeño detalle: elimine el "<" and ">" de su enlace; de ​​lo contrario, no funcionará (podría ver el documento porque edité la URL) –

4

Aquí hay un ejemplo simple que crea memoria compartida del tamaño de una estructura, escribe algunos datos y la imprime. Ejecute una instancia y creará la memoria compartida y pondrá algunos "datos" en ella, y luego esperará a que se presione una tecla. Ejecute una segunda instancia en un símbolo del sistema diferente, y la segunda instancia imprimirá el contenido de la memoria.

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; 
} 
+0

Gracias por el ejemplo. Esto es correcto (pero incompleto). ¿Alguna idea sobre cómo adjuntar/asociar una estructura a una memoria compartida? –

+0

@SangeethSaravanaraj: Asigna la memoria a un puntero a una estructura. Igual que la memoria de una llamada malloc. Debe asegurarse de que cada proceso tenga una definición idéntica de la estructura (con el mismo empaque). –

+0

@SangeethSaravanaraj: para divertirme, actualicé el ejemplo para usar una estructura y para ser un poco más interesante (permitir que dos instancias se ejecuten dos y que una llene la memoria y la otra para imprimirla). –

Cuestiones relacionadas