linux IPC之内存共享
来源:互联网 发布:无敌淘宝王全文 编辑:程序博客网 时间:2024/04/29 23:47
Posix 内存共享:
先调用shm_open然后再调用mmap,共享内存区对象的大小可在任何时刻通过ftruncate修改。
System V内存共享:
共享内存区是先调用shmget再调用shmat,其大小是在调用shmget创建时固定下来的。
因为Posix 接口较简洁,下面实列介绍Posix 共享内存的使用。System V内存共享的使用请参考SystemV内存共享示例。
Posix 内存共享服务端:
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/mman.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>char buf[10];char *ptr;int main(){ int fd; /*shm_open最主要的操作也是默认的操作就是在/dev/shm/下面,建立一个文件。文件名字是用户自己定义的。当然shm_open 也可以直接用open替换比如open("/tmp/memRegion", O_RDWR | O_CREAT , 0666)*/ fd = shm_open("region", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); if (fd<0) { printf("error open region\n"); return 0; } /* 一定要设置共享映射文件的大小,否则会段错误,调试时浪费了不少时间!*/ ftruncate(fd, 10); ptr = mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { printf("error map\n"); return 0; } *ptr = 0x12; return 0;}
Posix 内存共享客户端
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/mman.h>#include <sys/types.h>#include <fcntl.h>#include <sys/stat.h>char buf[10];char *ptr;int main(){ int fd; fd = shm_open("region", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); if (fd<0) { printf("error open region\n"); return 0; } /* 因为服务端已经设置好了大小,此处也可以不用设置!*/ ftruncate(fd, 10); ptr = mmap(NULL, 10, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (ptr == MAP_FAILED) { printf("error map\n"); return 0; } while (*ptr != 0x12); printf("ptr : %d\n", *ptr); return 0;}
也可以参考:linux内存共享
0 0
- linux IPC之内存共享
- Linux IPC之内存映射mmap()
- linux 进程通信之内存共享
- Linux进程间通信之内存共享
- linux之内存检查
- Linux服务器之内存
- 进程间通信之内存共享
- C#进程同步之内存共享
- 解剖linux内核之内存
- LINUX内核之内存屏障
- Linux核心之内存管理
- linux realloc之内存分配
- {linux程序}之内存池
- Linux 之内存管理(1)
- linux之内存管理(2)
- LINUX内核之内存屏障
- linux面试之内存管理
- LINUX内核之内存屏障
- 关于const的全面解答
- raspberry pi 上面的一些操作
- javascript正则表达式之最长匹配(贪婪匹配)和最短匹配(懒惰匹配)
- POJ 1061解题报告
- OC-知识点(概括)
- linux IPC之内存共享
- MFC加载GIF动画
- Jsoup解析HTML资料收集学习
- Web Service学习笔记(原理)
- 1029. Median
- 关于大型网站技术演进的思考(八)--存储的瓶颈终篇(8)
- poj1840 Eqs
- rm
- stemwin 之 字母显示