デバイスドライバ書いてると、mmap() が使えるようにしたいなー、とか思うわけで。
みたいな記事を読んで、理解できた気がするね。「Linux デバイスドライバ」という本がすごいわけですが、あれだけだとちょっと不十分な感じだったのだ。
そういえば普通にファイルを mmap() して読み書き、というのもやったことないや、と思ったので、ちょっと書いてみた。
#include <stdio.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> int main(){ int fd; char* p; int i; fd = open("textfile", O_RDWR); if(fd<0) printf("can't open!\n"); printf("fd=%d\n", fd); p= (char*)mmap(NULL, 100, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0); printf("p=%lx\n", (long unsigned int)p); if(p==MAP_FAILED) printf("can't mmap!\n"); for(i=0; i<100; i++) putchar(p[i]); for(i=0; i<10; i++) p[i]=0x30+i; close(fd); return 0; }
これで、配列の値を変更した通りにちゃんとファイルが書き換わる。Unix はかっこいい仕掛けがいっぱいあるなー。