linux IPC之内存共享

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值