プライベートアノニマスマッピングは MAP_PRIVATE と MAP_ANONYMOUS を組み合わせたマッピングです。
これもファイルマッピング同様に fork() をした場合は Copy-on-Write が適用されます。
main.c.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/mman.h>
5 #include <sys/stat.h>
6 #include <sys/types.h>
7 #include <unistd.h>
8 #include <fcntl.h>
9
10 #define BUF_SIZE 8
11
12 int main()
13 {
14 int i;
15 char *mm;
16
17 mm = mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
18 if(mm == MAP_FAILED){
19 perror("mmap");
20 exit(1);
21 }
22
23 pid_t id = fork();
24
25 if(id == 0) {
26 for(i = 0; i < BUF_SIZE-1; i++)
27 mm[i] = 'a'+i;
28 mm[BUF_SIZE-1] = '\0';
29
30 } else {
31 for(i = 0; i < BUF_SIZE-1; i++)
32 mm[i] = 'a';
33 mm[BUF_SIZE-1] = '\0';
34 }
35
36 for(i = 0; i < 10; i++)
37 printf("mm[%d] => %c\n",i,mm[i]);
38
39 if(munmap(mm,BUF_SIZE)==-1){
40 perror("munmap");
41 exit(1);
42 }
43
44 return 0;
45 }
ビルドと実行結果.
$ gcc main.c $ ./a.out mm[0] => a mm[1] => a mm[2] => a mm[3] => a mm[4] => a mm[5] => a mm[6] => a mm[7] => mm[8] => mm[9] => mm[0] => a mm[1] => b mm[2] => c mm[3] => d mm[4] => e mm[5] => f mm[6] => g mm[7] => mm[8] => mm[9] =>
MAP_ANONYMOUS ではメモリー間のマッピングなのでファイルは使われません。
基本的な挙動は MAP_PRIVATE のファイルマッピングと同じですね。
17 mm = mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS,-1,0);
18 if(mm == MAP_FAILED){
19 perror("mmap");
20 exit(1);
21 }この MAP_ANONYMOUS がアノニマスマッピングを指定しています。
それと fd は -1 を指定します。
fd 引数は通常は無視されるそうですが、一部のプラットフォームは -1 を指定するように作られているらしいので、MAP_ANONYMOUS を指定するときには fd 引数は -1 に設定しておくようにしてくださいね。
Copyright 2018-2019, by Masaki Komatsu