2012-04-01 8 views
5

Ich habe eine Struktur:Wie Shared Memory (Shmget/Shmat) in C ändern?

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

Ich schaffe für die Struktur gemeinsam genutzten Speicher wie folgt:

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

Dann greife ich auf den gemeinsam genutzten Speicher wie folgt aus:

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

Meine Frage ist, ziemlich einfach. Ist dies der richtige Weg, um Shared Memory zu öffnen/zu ändern? Ist das der beste Ansatz?

(I zum Synchronisation System V Semaphore verwende und ich habe nicht diesen Code enthalten. Ich wollte nur sicherstellen, dass ich Zugriff auf/korrekt auf den gemeinsamen Speicher zu ändern.)

Antwort

2

Das ist richtig, das einzige, was zu beachten ist, dass Sie ein PRIVATE Shared Memory Segment erstellen, was bedeutet, dass Sie das Shmid irgendwie an jeden anderen Prozess übertragen müssen, den Sie verwenden möchten.

+1

Wenn der andere Prozess 'fork()' ed ist, dann gibt es kein Problem mit dem IPC_PRIVATE, solange der gemeinsame Speicher vor dem 'fork()' erstellt wird. Der Vorbehalt gilt jedoch im allgemeineren Fall. –

4

Ja, es ist ein Weg, um erstellen, dann auf diesen freigegebenen Speicher zugreifen oder ihn ändern. Sie können jedoch Probleme mit der Synchronisierung haben, und Sie könnten z. Posix Semaphoren dafür. Siehe zuerst sem_overview(7) man page.

+0

danke. Mir geht es gut mit der Synchronisation. Ich war nur besorgt über "Daten-> Zeit = Zeit (null); oder Daten-> x = 5" und es etwas zu vermasseln. – bfresh