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