MAP_ANONYMOUS はファイルマッピング以外の大きめのマッピングに使うのですが、MAP_ANONYMOUS を使わなくても同様の効果を得る手法があります。
それが /dev/zero のファイル記述子を mmap() の引数に指定する手法です。
main.c.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <fcntl.h>
5 #include <sys/mman.h>
6
7 int main()
8 {
9 int fd;
10 int *buf;
11
12 fd = open("/dev/zero",O_RDWR);
13 buf = mmap(NULL,sizeof(int)*2,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
14 if(buf == MAP_FAILED) {
15 perror("MAP_FAILED");
16 exit(1);
17 }
18
19 if(close(fd)==-1){
20 perror("close");
21 exit(1);
22 }
23
24 *buf = 100;
25 ++buf;
26 *buf = 200;
27
28 printf("%p : %d\n",buf,*buf);
29 --buf;
30 printf("%p : %d\n",buf,*buf);
31
32 if(munmap(buf,sizeof(int)*2)==-1){
33 perror("munmap");
34 exit(1);
35 }
36
37 return 0;
38 }
$ gcc main.c $ ./a.out 0x7f9204ec1004 : 200 0x7f9204ec1000 : 100
重要な点はマッピングの元ファイルを /dev/zero と指定することです。
12 fd = open("/dev/zero",O_RDWR);ただ MAP_ANONYMOUS にはこの open() 関数を使うことが無いため、基本的には不要ですかね…
(´・ω・`)
まあ使うことはないでしょうが、紹介までに…
Copyright 2018-2019, by Masaki Komatsu