POSIX共享内存之shm_open oflag参数注意点

int shm_open(const char *name, int oflag, mode_t mode);


shm_open的第二个参数oflag,可被设置为:O_RDONLY, O_RDWR, O_CREAT, O_EXCL, O_TRUNC

注意其属性设置是针对所有将会访问到它的进程而言的,而不仅仅是针对开辟它的这一进程的。

例如,一块共享内存,进程A创建它,只有读它的需求,进程B访问它,有写它的需求。那么,进程A创建它的时候,就应该把oflag设置为O_RDWR,而不是O_RDONLY
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用shm_open函数创建共享内存,并将map类型数据存入其中,同时支持通过下标访问数据。以下是实现步骤: 1. 使用shm_open函数创建共享内存对象。 2. 调用ftruncate函数设置共享内存大小。 3. 使用mmap函数将共享内存映射到进程地址空间中。 4. 在共享内存中使用placement new操作符构造一个map对象。 5. 在map对象中插入数据。 6. 通过下标访问map对象中的数据。 7. 销毁map对象,使用placement delete操作符。 8. 解除映射,使用munmap函数。 9. 关闭共享内存文件,使用close函数。 需要注意的是,多个进程同时访问共享内存中的map对象时,应该使用锁机制来实现同步。可以使用POSIX信号量或互斥锁等机制来实现。以下是示例代码: ```c++ #include <map> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> template <typename T> struct SharedMemoryMap { static_assert(std::is_trivially_copyable<T>::value, "T must be trivially copyable"); SharedMemoryMap(const char* name, size_t size) : m_map(nullptr) , m_size(size) { // 创建共享内存 m_fd = shm_open(name, O_RDWR | O_CREAT, 0666); if (m_fd == -1) { perror("shm_open"); return; } // 设置共享内存大小 if (ftruncate(m_fd, m_size) == -1) { perror("ftruncate"); close(m_fd); return; } // 映射共享内存 m_map = static_cast<std::map<int, T>*>(mmap(nullptr, m_size, PROT_READ | PROT_WRITE, MAP_SHARED, m_fd, 0)); if (m_map == MAP_FAILED) { perror("mmap"); close(m_fd); return; } // 构造map对象 new (m_map) std::map<int, T>(); } ~SharedMemoryMap() { // 销毁map对象 m_map->~map(); // 解除映射 munmap(m_map, m_size); // 关闭共享内存文件 close(m_fd); } T& operator[](int key) { return (*m_map)[key]; } private: int m_fd; std::map<int, T>* m_map; size_t m_size; }; int main() { SharedMemoryMap<std::string> sharedMap("/my_shm", 1024 * 1024); // 写入数据 sharedMap[1] = "hello"; sharedMap[2] = "world"; // 读取数据 std::string str = sharedMap[1]; qDebug() << QString::fromStdString(str); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值