wl.c (899B)
1 #include <errno.h> 2 #include <fcntl.h> 3 #include <sys/mman.h> 4 #include <time.h> 5 #include <unistd.h> 6 7 static void randname(char* buf) { 8 struct timespec ts; 9 clock_gettime(CLOCK_REALTIME, &ts); 10 long r = ts.tv_nsec; 11 for (int i = 0; i < 6; ++i) { 12 buf[i] = 'A' + (r & 15) + (r & 16) * 2; 13 r >>= 5; 14 } 15 } 16 17 static int create_shm_file(void) { 18 int retries = 100; 19 do { 20 char name[] = "/wl_shm-XXXXXX"; 21 randname(name + sizeof(name) - 7); 22 --retries; 23 int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600); 24 if (fd >= 0) { 25 shm_unlink(name); 26 return fd; 27 } 28 } while (retries > 0 && errno == EEXIST); 29 return -1; 30 } 31 32 int allocate_shm_file(size_t size) { 33 int fd = create_shm_file(); 34 if (fd < 0) return -1; 35 int ret; 36 do { 37 ret = ftruncate(fd, size); 38 } while (ret < 0 && errno == EINTR); 39 if (ret < 0) { 40 close(fd); 41 return -1; 42 } 43 return fd; 44 }