第84章 /dev/zero

 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