#define _GNU_SOURCE 1 #include <sys/mman.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(void) { /* first find free segment of 40K, then unmap it */ void *initial_area = mmap((void *)0x10000000, 40960, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,0,0); if (initial_area == MAP_FAILED) perror ("initial area"); printf("initial_area= %p\n", initial_area); if (munmap(initial_area, 40960) != 0) perror ("munmap initial_area"); /* remap the same segment, but with 4K size */ void *area = mmap(initial_area, 4096, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE,0,0); if (area == MAP_FAILED) perror ("area"); if (area != initial_area) printf("FAILED : was expecting to get back the initial_area\n"); printf("area= %p\n", area); strcpy(area, "Hello World"); /* extend it to 40K */ void *a2 = mremap(area, 4096, 40960, 0); if (a2 == MAP_FAILED) { perror("mremap"); } if (a2 != initial_area) printf("FAILED : was expecting to get back the same area increased\n"); printf("increased area= %p\n", a2); printf("%s\n", (char *)a2); return 0; }