2016-03-29 30 views
2

1024 boyutunda bir paylaşımlı bellek bölümüm varsa, üç farklı büyüklükteki bölgeleri nasıl kopyalarım? Aşağıdakileri denedim, ancak bir seg hatası var. Sanırım bir şey doğru hizalanmadı ama nerede olduğunu izole edemiyorum.Paylaşılan bir belleği C'deki 3 farklı boyutlu mmap işaretçisine nasıl bölebilirim?

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); 

cevap

1

Adam Martin notes olarak, ofsetler sayfa boyutunun katları olmalıdır. Ama muhtemelen üç ayrı mmap s gerekir ve yok Belki sadece mmap kez ve bu tek haritalama farklı sapmalarına kullanım işaretçileri: Sadece (addr0 üzerine munmap aramaya

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); 

Unutma bu noktada her üç işaretçiler de geçersiz hale getir).

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); 
: Alternatif olarak, aynı başlangıç ​​noktasından Eğer mmap üç kez ve tek tek her işaretçi ayarlamak (her değerin ayrı ayrı munmap sizi sağlayacak olan sadece orijinal pointer, değil düzeltilmiş işaretçi üzerinde bunu yapmak için emin olun)
0

Sizin ofset (mmap son argüman) sayfa boyutu man bir katı olmalıdır. Ayrıca, bu yazımın bunu kopyaladığını sizden aldığınızı düşünürsem de fruncateftruncate olmalıdır, aksi takdirde kodunuz derlenmemelidir.