2016-12-02 3 views
0
int shmid; 
int* locat; 

//create shared memory segment 
shmid = shmget(6666, size, 0666); 
if (shmid < 0) { 
    perror("shmget"); 
    exit(1); 
} 

locat = (int *) shmat(shmid, NULL, 0); 
if (locat == (int *) -1) { 
    perror("shmat"); 
    exit(1); 
} 

Ich gründet Shared Memory als solche nach oben, aber ich erhalte immer diese Fehlermeldung: shmget: No such file or directoryShared Memory in C: shmget Probleme

Dieser Code funktioniert gut, nicht sicher, warum dies jetzt geschieht.

+0

Die Erstellung Ihres Shared Memory ist fehlgeschlagen und 'shmget' hat' -1' zurückgegeben. Sehen Sie sich http://stackoverflow.com/questions/7495326/understanding-shared-memory-using-c an – MrKiwi

Antwort

1

As the man says

IPC_CREAT

Create a new segment. If this flag is not used, then shmget() will find the segment associated with key and check to see if the user has permission to access the segment.

Sie haben IPC_CREAT zu Ihrem shmget Anruf

shmid = shmget(6666, size, IPC_CREAT | 0666); 

Sie auch die IPC_EXCL verwenden könnte hinzufügen, um sicherzustellen, dass das Segment neu

IPC_EXCL

This flag is used with IPC_CREAT to ensure that this call creates the segment. If the segment already exists, the call fails.

1

Es entsteht sind zwei Dinge:

  1. Wenn Sie einen freigegebenen Speicher (entsprechend einem bestimmten Schlüsselwert) initialisieren möchten, müssen Sie BITWISE ODER die Berechtigungsnummer mit IPC_CREAT eingeben.

Genau wie

shmget(6666 , size , 0666|IPC_CREAT); 
  1. Wenn Sie das gleiche Segment (durch den Schlüsselwert identifiziert) anhängen möchten an einen anderen Prozess, ist IPC_CREAT nicht zwingend notwendig, da der gemeinsame Speicher wurde bereits der logische Adressraum erstellt.