#include #include #include #include #include #include struct foo { int a; char data[500]; }; char *greeting = "Hello again %s"; void fn(void *base) { struct foo *a = (struct foo*)base; a->a = 12345; sprintf(a->data, greeting, getenv("USER")); printf("a.a: %d\n", a->a); printf("a data: %s\n", a->data); } int main(int argc, char *argv[argc+1]) { int fd = open(argv[1], O_CREAT | O_RDWR); // 100 MB size_t len = 100 << 20; if (ftruncate(fd, len) == -1) { perror("truncate"); return EXIT_FAILURE; } printf("fd: %d\n", fd); void *base = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (base == MAP_FAILED) { perror("mmap"); return EXIT_FAILURE; } fn(base); printf("Syncing...\n"); msync(base, len, MS_SYNC); printf("Unmapping...\n"); munmap(base, len); }