2014-02-18 7 views
7

In Linux möchte ich einige Speicherinhalte meines Prozesses mit anderen Prozessen teilen. einer der Weg, dies zu tun ist mit shm_open und mmap. Wie unten.Wie kann ich vorhandenen Speicher mit shm_open teilen?

/* Create a new memory object */ 
fd = shm_open("/bolts", O_RDWR | O_CREAT, 0777); 
if(fd == -1) { 
    fprintf(stderr, "Open failed:%s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Set the memory object's size */ 
if(ftruncate(fd, sizeof(*addr)) == -1) { 
    fprintf(stderr, "ftruncate: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Map the memory object */ 
addr = mmap(0, sizeof(*addr), 
     PROT_READ | PROT_WRITE, 
     MAP_SHARED, fd, 0); 
if(addr == MAP_FAILED) { 
    fprintf(stderr, "mmap failed: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

Allerdings kann ich auf diese Weise den "bereits zugewiesenen Speicher" nicht teilen. meine Frage ist: kann ich den zuvor zugewiesenen Speicherinhalt freigeben, ohne sie neu zuzuordnen ?.

danke im voraus.

+0

Es ist ziemlich schwer, herauszufinden, was Sie unter „bereits zugewiesenen Speicher“ bedeuten und „vorher zugewiesenen Speicher“. Wenn Sie diesen Speicher teilen möchten, öffnen Sie einfach einen anderen Prozess, der/bolts path und mmap() es, die beiden Prozesse teilen dann das gleiche Stück Speicher. – nos

+0

Lesen Sie [shm_overview (7)] (http://man7.org/linux/man-pages/man7/shm_overview.7.html) –

+0

Schritt 1. Angenommen, wir haben Speicherbereich um 0x1000 mit RWX-Berechtigung und MAP_PRITAVE | MAP_ANONYMOUS mmaped Flagge. Schritt 2. Wir schreiben einige Daten bei der Speicheradresse 0x1000. Schritt 3. Wir wollen den Speicherinhalt bei 0x1000 (virtuelle Adresse muss 0x1000 sein) mit einem anderen Prozess teilen. Ich stecke bei Schritt 3 fest. – daehee

Antwort

0

Ihr Code teilt zwar den Speicher, aber beide Prozesse erhalten unterschiedliche Adressregionen. Sie möchten dieselbe Region haben, so dass der Addr-Wert derselbe ist. In diesem Fall können Sie Objekte in diesem Speicher erstellen, interne Zeiger verwenden und Ihre Objekte sind in beiden Prozessen gültig und sichtbar.

Es gibt zwei Methoden, wie Sie das tun können.

1) tun fork() einen anderen Prozess zu erstellen

2) stellen Mmap mit MAP_FIXED Speicher an die spezielle Adresse zuzuweisen.

Für die Nummer zwei Ihr Code aussieht:

/* Create a new memory object */ 
fd = shm_open("/bolts", O_RDWR | O_CREAT, 0777); 
if(fd == -1) { 
    fprintf(stderr, "Open failed:%s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

/* Set the memory object's size */ 
if(ftruncate(fd, sizeof(*addr)) == -1) { 
    fprintf(stderr, "ftruncate: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

// You base address for memory region that you want to share. 
// Choose this carefully, you both processes MUST have it available! 
void * baseAddr = 0x7fff00000000; 

/* Map the memory object */ 
addr = mmap(baseAddr, sizeof(*addr), 
     PROT_READ | PROT_WRITE, 
     MAP_SHARED | MAP_FIXED, fd, 0); 

if(addr == MAP_FAILED | MAP_FIXED) { 
    fprintf(stderr, "mmap failed: %s\n", 
     strerror(errno)); 
    return EXIT_FAILURE; 
} 

image

Verwandte Themen