进程间通信-POSIX 共享内存
#include <sys/mman.h> int shm_open(const char *name, int oflag, mode_t mode);
参数说明
返回值
#include <unistd.h> int ftruncate(int fd, off_t length);
参数说明
返回值
#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数说明
返回值

#include <sys/mman.h> int msync(void *addr, size_t length, int flags);
参数说明
返回值
注意事项
#include <sys/mman.h> int munmap(void *addr, size_t length);
参数说明
返回值
注意事项
#include <sys/mman.h> int shm_unlink(const char *name);
参数说明
返回值
1 #include<stdio.h> 2 #include<fcntl.h> 3 #include<sys/mman.h> 4 #include<unistd.h> 5 #include<sys/stat.h> 6 7 int main(int argc, char** argv) 8 { 9 size_t mem_size = sysconf(_SC_PAGE_SIZE) * 2; 10 int fd; 11 12 AGAIN: 13 fd = shm_open("/my_shm", O_CREAT | O_RDWR | O_EXCL, 0666); 14 if(fd == -1) 15 { 16 if(errno == EEXIST) 17 { 18 shm_unlink("/my_shm"); 19 goto AGAIN; 20 } 21 perror("shm_open"); 22 return -1; 23 } 24 25 int ret = ftruncate(fd, mem_size); 26 if(ret == -1) 27 { 28 perror("ftruncate"); 29 return -1; 30 } 31 32 void *ptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 33 if(ptr == MAP_FAILED) 34 { 35 perror("mmap"); 36 return -1; 37 } 38 39 int i = 0; 40 sprintf(ptr, "Data%d", i); 41 while(1); 42 43 close(fd); 44 munmap(ptr, mem_size); 45 return 0; 46 }
$ cat /dev/shm/my_shm
Data1
$ cat /dev/shm/my_shm
//无数据
1 #include<stdio.h> 2 #include<fcntl.h> 3 #include<sys/mman.h> 4 #include<unistd.h> 5 #include<sys/stat.h> 6 #include<errno.h> 7 8 int main(int argc, char** argv) 9 { 10 size_t mem_size = sysconf(_SC_PAGE_SIZE) * 2; 11 int fd = shm_open("/my_shm", O_CREAT | O_TRUNC | O_RDWR, 0666); 12 if (fd == -1 && errno != EEXIST) 13 { 14 perror("shm_open"); 15 return -1; 16 } 17 18 int ret = ftruncate(fd, mem_size); 19 if(ret == -1) 20 { 21 perror("ftruncate"); 22 return -1; 23 } 24 25 void *ptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 26 if(ptr == MAP_FAILED) 27 { 28 perror("mmap"); 29 return -1; 30 } 31 32 while (1) 33 { 34 printf("read data : %s\n", (char *)ptr); 35 sleep(1); 36 } 37 38 close(fd); 39 40 return 0; 41 }
1 #include<stdio.h> 2 #include<fcntl.h> 3 #include<sys/mman.h> 4 #include<unistd.h> 5 #include<errno.h> 6 #include<sys/stat.h> 7 8 int main(int argc, char** argv) 9 { 10 size_t mem_size = sysconf(_SC_PAGE_SIZE) * 2; 11 int fd; 12 AGAIN: 13 fd = shm_open("/my_shm", O_CREAT | O_TRUNC | O_RDWR, 0666); 14 if (fd == -1) 15 { 16 if (errno == EEXIST) 17 { 18 goto AGAIN; 19 } 20 perror("shm_open"); 21 return -1; 22 } 23 24 int ret = ftruncate(fd, mem_size); 25 if(ret == -1) 26 { 27 perror("ftruncate"); 28 return -1; 29 } 30 31 void *ptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 32 if(ptr == MAP_FAILED) 33 { 34 perror("mmap"); 35 return -1; 36 } 37 38 int i = 0; 39 while(1) 40 { 41 sprintf(ptr, "Data%d", i++); 42 printf("write data : %s\n", (char*)ptr); 43 sleep(1); 44 } 45 46 close(fd); 47 munmap(ptr, mem_size); 48 49 return 0; 50 }

浙公网安备 33010602011771号