2016-03-29 3 views
2

共有メモリセグメントが1024サイズの場合、どのように3つの異なるサイズの領域をmmapするのですか?私は次のことを試みたが、segの欠陥があった。私は何かが正しく整列していないと思うが、どこを分離するように見えることはできない。Cで1つの共有メモリを3つの異なるサイズのmmapポインタに分割するにはどうすればよいですか?

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

答えて

1

Adam Martin notesとして、オフセットはページサイズの倍数である必要があります。しかし、あなたはおそらく3つの別々のmmap秒を必要としない、その単一のマッピングの異なるオフセットにできたばかりmmap一度、使用ポインタ:

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

ちょうどのみすべての3つのポインタ、その時点で(addr0munmapを呼び出すことを忘れないでください無効になる)。

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); 
:また、同じ始点からあなた mmap三回は、個別に各ポインタを調整(各値を個別 munmapにあなたを許すことになる、ちょうどオリジナルのポインタではなく、調整後のポインタでそうしてください)
0

あなたのオフセット(mmapへの最後の引数)は、ページサイズmanの倍数でなければなりません。またfruncateftruncateでなければなりませんが、私はあなたが誤植を導入したと仮定していますが、そうでなければあなたのコードはコンパイルすべきではありません。

関連する問題