2016-03-29 5 views
2

Wenn ich ein gemeinsames Speichersegment mit der Größe 1024 habe, wie kann ich dann drei unterschiedlich große Bereiche davon mappen? Ich habe folgendes versucht, habe aber einen seg Fehler. Ich denke, dass etwas nicht richtig ausgerichtet ist, aber ich kann nicht isolieren, wo.Wie kann ich einen gemeinsamen Speicher in 3 unterschiedlich große mmap Zeiger in C teilen?

fd = shm_open(NAME, FLAGS, MODE); 
ftruncate(fd, 1024); 
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0); 
addr1 = mmap(NULL, 100, PROTS, FLAGS, fd, 50); 
addr2 = mmap(NULL, 874, PROTS, FLAGS, fd, 150); 

Antwort

1

Wie Adam Martin notes, müssen Offsets ein Vielfaches der Seitengröße sein. Aber Sie wahrscheinlich nicht brauchen drei separate mmap s, und konnte nur mmap einmal und Verwendung Zeiger auf verschiedene Offsets dieses einzelnen Mapping:

fd = shm_open(NAME, FLAGS, MODE); 
ftruncate(fd, 1024); 
addr0 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0); 
addr1 = (void*)((char*)addr0 + 50); 
addr2 = (void*)((char*)addr1 + 100); 

Denken Sie daran, nur munmap auf addr0 zu nennen (wobei an diesem Punkt alle drei Zeiger ungültig werden). Alternativ Sie mmap vom gleichen Startpunkt dreimal und stellt jeweils einzeln Zeiger (die Sie zu munmap individuell jeden Wert erlauben würde, so stellen Sie sicher, dass so auf dem ursprünglichen Zeiger zu tun, nicht die eingestellte Zeiger):

fd = shm_open(NAME, FLAGS, MODE); 
ftruncate(fd, 1024); 
addr0 = mmap(NULL, 50, PROTS, FLAGS, fd, 0); 
char *const baseaddr1 = mmap(NULL, 150, PROTS, FLAGS, fd, 0); 
char *const baseaddr2 = mmap(NULL, 1024, PROTS, FLAGS, fd, 0); 
addr1 = (void*)(baseaddr1 + 50); 
addr2 = (void*)(baseaddr2 + 150); 
0

Ihre Offset (letzte Argument zu mmap) muss ein Vielfaches von Seitengröße man sein. Auch fruncate sollte ftruncate sein, obwohl ich nehme an, dass Sie diesen Tippfehler eingeführt kopieren, sonst sollte der Code nicht kompilieren.

Verwandte Themen