2011-12-12 13 views
7

Sto tentando di progettare/implementare una coda (circolare) (in C) come memoria condivisa in modo che possa essere condivisa tra più thread/processi.Progettazione di una coda per essere una memoria condivisa

La struttura della coda è come segue:

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

che supporta le seguenti funzioni:

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

Secondo la dimensione della coda menzionato dall'utente, la memoria per q_data saranno destinati, create_q().

Domanda: Come creare una memoria condivisa per questa coda utilizzando le funzioni di sistema fornite in "sys/shm.h"? Qualsiasi frammento di codice/esempio per creare/allegare/recuperare/eliminare la memoria condivisa per la struttura dati della coda usando shmget(), shmat(), shmctl(), ecc. Sarebbe di grande aiuto.

+0

Se si desidera comunicare i processi utilizzando un meccanismo simile a una coda, non sarebbe meglio utilizzare [code di messaggi] (http://www.it.uom.gr/teaching/c_marshall/node25.html)? Attraverso thread dello stesso processo, una coda standard protetta da una sezione critica sarebbe sufficiente –

+0

@dario_ramos code di messaggi sarebbe una soluzione ideale per questo problema .. ma sto cercando di dare un esempio usando una coda per scoprire come allegare una struttura dati con una memoria condivisa. –

+0

In questo caso, quando ho fatto confusione con Unix IPC, ho seguito [la guida di Beej su Unix IPC] (http://beej.us/guide/bgipc/). Ha anche qualche barzelletta! Puoi andare direttamente alla [sezione memoria condivisa] (http://beej.us/guide/bgipc/output/html/multipage/shm.html) –

risposta

2

Quando ho pasticciato con Unix IPC, ho seguito Beej's guide to Unix IPC. Ha anche qualche barzelletta! Puoi andare direttamente allo shared memory section. Ha frammenti che spiegano ogni passaggio e un esempio completo alla fine.

+0

La guida di Beej è fantastica. Grazie per la condivisione. :) –

+0

Ho fatto riferimento anche a questo .. informazioni relativamente buone. –

+0

Sembra un riferimento più dettagliato, buono per te. Un piccolo dettaglio: Rimuovi il "<" and ">" dal tuo link, altrimenti non funzionerà (potrei vedere il documento perché ho modificato l'URL) –

4

Ecco un semplice esempio che crea memoria condivisa delle dimensioni di una struttura, scrive alcuni dati su di essa e li stampa. Esegui un'istanza e creerà la memoria condivisa e inserirà alcuni "dati", quindi attenderà la pressione di un tasto. Eseguire una seconda istanza in un prompt dei comandi diverso e la seconda istanza stamperà il contenuto della 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

Grazie per l'esempio. Questo è corretto (ma incompleto). Qualche idea su come allegare/associare una struttura ad una memoria condivisa? –

+0

@SangeethSaravanaraj: Assegna la memoria a un puntatore a una struttura. Come la memoria di una chiamata malloc. È necessario assicurarsi che ogni processo abbia una definizione identica della struttura (con lo stesso imballaggio). –

+0

@SangeethSaravanaraj: Per divertimento, ho aggiornato l'esempio per utilizzare una struttura e per essere leggermente più interessante (concedi due istanze due in esecuzione e una che riempie la memoria e l'altra per stamparla). –

Problemi correlati