#include #include #include int main () { char *p; int sz = 0x2000; int keep = 0x1000; int offset; int magic = 0x33; int pid; int rv; p = (char *) mmap (0, sz, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); printf ("mmap() = %p\n", p); #define KEEPLO #ifdef KEEPLO /* keep lower chunk -> ok */ rv = munmap (p+keep, sz-keep); offset = 0x42; #else /* keep upper chunk -> segv */ rv = munmap (p, keep); offset = keep + 0x42; #endif printf ("munmap() = %d\n",rv); p[offset] = magic; pid = fork (); switch (pid) { case (-1): printf ("fork() failed\n"); break; case (0): printf ("child touching %p\n", &(p[offset])); printf ("child M[%p] = 0x%x\n", &(p[offset]), p[offset]); break; default: printf ("parent touching %p\n", &(p[offset])); printf ("parent M[%p] = 0x%x\n", &(p[offset]), p[offset]); break; } return 0; }