linux使用mmap共享内存封装动态库,实现全局变量对外只读接口

想要实现的功能:动态库中定义结构体类型全局变量(一个结构体中嵌套多个结构体),该变量在库内可读写,但主程序(外部程序)只可读,不可写。

方便说明,简化成一个如下的结构体变量:

typedef struct
{
   
   
    int a;
    int b;
    int c;
} Test_STU;

思路:

  1. 结构体改成类,public成员,通过get()方法获取——不喜欢,直接采用 . 结构体方式访问最好;
  2. 结构体改成类,public成员,添加const修饰——不喜欢,变量很多,初始化列表不方便,且类内以及其它类内无法修改变量,而且const并非完全保证变量不会被修改,比如const_cast;
  3. 对于让外部程序可读可写的全局变量,库内定义好一个对该变量的引用,如:Test_STU&Test,外部程序可通过extern &Test声明后使用;那么类似,针对只读的变量,库内定义时候使用const &修饰,如const Test_STU & Test,外部程序也通过extern &Test声明后使用——测试不行,const属性只在本编译模块有效,外部程序依然可以通过Test.a改写;

思考:本质上是想获取一个对某一片内存区域只有访问权限的指针!

思路:
联想多进程通信中的共享内存,在同一进程中使用shm_open打开同一文件,通过mmap建立两块内存映射区,获得操作该内存区域的指针,在建立映射区时,一个权限设为可读可写,一个权限设为只读……好像可以,试试……

动态库部分代码:

test.h

#ifndef TEST_H
#define TEST_H

#include "test_global.h"
#include <iostream>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

type
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值