Linux系统编程:IPC共享内存

共享内存:文件映射到共享内存,用于传送数据

1. POSIX 共享内存

在这里插入图片描述
查看:
共享内存一般生成在 ls /dev/shm
ls /dev/ 看到绿色的文件都是用来通信的

接口:
头文件: sys/mman.h
库: librt.so

2. 函数

操作 函数
创建 int shm_open(const char *name, int oflag, mode_t mode)
删除 int shm_unlink(const char *name)
建立内存映射 void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset)
关闭内存映射 int munmap(void *start,size_t length)

创建内存映射

创建 shm_open(文件名, 标志, 权限)

建立内存映射 mmap(通常为NULL, 映射区域长度, 内存保护标志, 映射对象类型, 文件描述符, 通常为0)
内存保护标志:

参数 含义
PROT_EXEC 页内容可以被执行
PROT_READ 页内容可以被读取
PROT_WRITE 页可以被写入
PROT_NONE 页不可访问,不能与文件的打开模式冲突

映射对象类型:

参数 含义
MAP_SHARED 变动共享
MAP_PRIVATE 变动私有
MAP_ANON 匿名内存映射

返回值:

返回值 含义
MAP_FAILED 失败
其他 共享内存地址

关闭内存映射 int munmap(开始地址, 区域长度)

示例:
创建文件并映射到共享内存

#include <iostream>
#include <sys/shm.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>
using namespace std;

int main(int argc,char* argv[]){
   
        int fd = open(argv[1],O_RDWR);         // 创建文件
        if(-1 == fd){
   
                perror("shm_open error");
                return 1;
        }

        void* p = mmap(NULL,1024,PROT_READ,MAP_PRIVATE,fd,0);       // 建立内存映射
        if(MAP_FAILED == p){
   
                perror("mmap error");
                return 1;
        }
        cout << (char*)p << endl;
        munmap(p,1024);              // 关闭内存映射
        p = NULL;

        close(fd);
}

结果为:

[root@foundation1 C++7.11]# vim file_map.cpp 
[root@foundation1 C++7.11]# g++ file_map.cpp -lrt
[root@foundation1 C++7.11]# ./a.out ./file_map.cpp 
#include <iostream>
#include <sys/shm.h>
// 后面为文件内容,即程序,省略

直接可以把别的文件映射出来

3. 给文件追加信息

传统的方式:拷贝到原数据后面

#include <unistd.h>
#include <iostream>
#include <cstring>
#include <fcntl.h>
using namespace std;

int main(int argc,char* argv[]){
   
        int fd = open(argv[1],O_RDWR);
        if(-1 == fd){
   
                perror("open error");
                return 1;
        }

        char buffer[1024
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值