宇宙ドーナツ研究会

セキュリティ系お勉強メモ

mmapでファイルとマッピングしたメモリへの書き込み後、msyncは必要か

mmapマッピングされたメモリ領域に対して書き込みをしても、 msyncは絶対必要というわけではない。

書き込みをすれば、それはいずれ(カーネル側の都合の良いタイミングで)、ファイルに反映されるから。

#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
    int fd;
    char *cp;

    fd = open("/home/user/labo/mmap/tmp", O_RDWR);
    cp = mmap(NULL, sizeof(char), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);

    puts("now read");
    printf("%c\n", *cp);

    *cp = *cp + 1;
    puts("now written");
    printf("%c\n", *cp);

    return 0;
}

以下、結果。 msyncしなくても、ファイル中の値がインクリメントされていくのがわかる。

user @ makeos:~/labo/mmap$ cat tmp
a
user @ makeos:~/labo/mmap$ gcc -o mmap mmap.c
user @ makeos:~/labo/mmap$ echo a > tmp
user @ makeos:~/labo/mmap$ ./mmap 
now read
a
now written
b
user @ makeos:~/labo/mmap$ ./mmap 
now read
b
now written
c