#include #include #include #include #include #include #include #include #include void error_and_die(const char *msg) { perror(msg); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int r; const char *memname = "sample"; const size_t region_size = sysconf(_SC_PAGE_SIZE); int fd = shm_open(memname, O_CREAT | O_TRUNC | O_RDWR, 0666); if (fd == -1) error_and_die("shm_open"); r = ftruncate(fd, region_size); if (r != 0) error_and_die("ftruncate"); void *ptr = mmap(0, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) error_and_die("mmap"); close(fd); pid_t pid = fork(); if (pid == 0) { u_long *d = (u_long *) ptr; *d = 0xdbeebee; exit(0); } else { int status; waitpid(pid, &status, 0); printf("child wrote %#lx\n", *(u_long *) ptr); } r = munmap(ptr, region_size); if (r != 0) error_and_die("munmap"); r = shm_unlink(memname); if (r != 0) error_and_die("shm_unlink"); return 0; }