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