第83章 fork() で共有アノニマスマッピングをチェック

 共有アノニマスマッピングは MAP_SHARED と MAP_ANONYMOUS を合わせて指定しただけのものです。

 それとファイルマッピングではないですね。

 では検証してみましょう。

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_SHARED|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] => b
mm[2] => c
mm[3] => d
mm[4] => e
mm[5] => f
mm[6] => g
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] =>

 ファイルマッピングでなく、メモリー間のマッピングというだけなので、共有オブジェクトのマッピングとは変わりないですかね。

 17   mm = mmap(NULL,BUF_SIZE,PROT_WRITE|PROT_READ,MAP_SHARED|MAP_ANONYMOUS,-1,0);
 18   if(mm == MAP_FAILED){
 19     perror("mmap");
 20     exit(1);
 21   }

 この部分に MAP_ANONYMOUS が指定されてるくらいです。

Copyright 2018-2019, by Masaki Komatsu