2012-04-01 18 views
5

tengo una estructura:¿Cómo modificar la memoria compartida (shmget/shmat) en C?

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

creo memoria compartida para la estructura de la siguiente manera:

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

Entonces acceder a la memoria compartida como esto:

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

Mi pregunta es bastante simple. ¿Es esta la manera correcta de acceder/modificar la memoria compartida? ¿Es este el mejor enfoque?

(estoy usando System V semáforos para la sincronización y no han incluido ese código. Sólo quería asegurarse de que yo soy el acceso/modificación de la memoria compartida correctamente.)

Respuesta

2

Esto es correcto, lo único importante es que está creando un segmento de memoria compartida PRIVADO, lo que significa que tendrá que transmitir el shmid de alguna manera a cualquier otro proceso que desee que lo use.

+1

Si el otro proceso es 'fork()' ed, entonces no hay problema con el IPC_PRIVATE siempre que la memoria compartida se cree antes de 'fork()'. La advertencia es válida en el caso más general, sin embargo. –

4

Sí, es una manera de crear, luego acceder o modificar esa memoria compartida. Sin embargo, puede tener problemas de sincronización, y podría usar, p. Semáforos de Posix para eso. Consulte la primera página de manual de sem_overview(7).

+0

gracias. estoy bien con la sincronización. Solo me preocupaba hacer "data-> time = time (null); o data-> x = 5" y arruinar algo. – bfresh

Cuestiones relacionadas