int main(int argc, char **argv) { int fd1, fd2, *ptr1, *ptr2; pid_t childpid; struct stat stat; if (argc != 2) err_quit("Usage: test2 <name>"); Shm_unlink(Px_ipc_name(argv[1])); fd1 = Shm_open(Px_ipc_name(argv[1]), O_RDWR | O_CREAT | O_EXCL, FILE_MODE); Ftruncate(fd1, sizeof(int)); fd2 = Open("./shm", O_RDONLY); Fstat(fd2, &stat); if ((childpid = Fork()) == 0) { ptr2 = Mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd2, 0); ptr1 = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0); printf("child: shm ptr = %p, motd ptr = %p\n", ptr1, ptr2); sleep(5); printf("shared memory integer = %d\n", *ptr1); exit(0); } //parent: map in reverse order from child ptr1 = Mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd1, 0); ptr2 = Mmap(NULL, stat.st_size, PROT_READ, MAP_SHARED, fd2, 0); *ptr1 = 777; Waitpid(childpid, NULL, 0); exit(0); }
int main(int argc, char **argv) { if (argc != 2) err_quit("usage: shmunlink <name>"); Shm_unlink(argv[1]); exit(0); }
int unlink_shmfile(const char *name){ // See notes from create_shmfile() on why we do this differently on // FreeBSD and Linux. #ifdef LIB_COMPAT_FREEBSD if(Shm_unlink(name)){ return -1; } #else #ifdef LIB_COMPAT_LINUX if(Unlink(name)){ return -1; } #else bitch("No support for %s on this OS\n",name); return -1; #endif #endif return 0; }