2012-04-01 6 views
5

Ho uno struct:Come modificare la memoria condivisa (shmget/shmat) in C?

struct sdata { 
    int x; 
    int y; 
    time_t time; 
}; 

creo memoria condivisa per la struct come segue:

size_t shmsize = sizeof(struct sdata); 
shmid = shmget(IPC_PRIVATE, shmsize, IPC_CREAT | 0666); 

Poi ho accedere alla memoria condivisa in questo modo:

struct sdata *data = shmat(shared.shmid, (void *) 0, 0); 
data->time = time(NULL); // function returns the current time 

La mia domanda è abbastanza semplice. È questo il modo giusto per accedere/modificare la memoria condivisa? È questo l'approccio migliore?

(sto usando System V semafori per la sincronizzazione e non ho incluso quel codice. Volevo solo per assicurarsi che io sono l'accesso/modifica della memoria condivisa in modo corretto.)

risposta

2

Questo è corretto, l'unica cosa da notare è che si sta creando un segmento di memoria condivisa PRIVATA, il che significa che dovrai trasmettere shmid in qualche modo a qualsiasi altro processo che desideri utilizzarlo.

+1

Se l'altro processo è 'fork()' ed, allora non ci sono problemi con IPC_PRIVATE se la memoria condivisa viene creata prima di 'fork()'. L'avvertenza è valida nel caso più generale, però. –

4

Sì, è un modo per creare, quindi accedere o modificare quella memoria condivisa. Tuttavia, potresti avere problemi di sychronizaton e potresti utilizzare ad es. Posix semafori per quello. Vedi la prima pagina man di sem_overview(7).

+0

grazie. sto bene con la sincronizzazione. ero solo preoccupato di fare "data-> time = time (null) o data-> x = 5" e mi incasinava qualcosa. – bfresh