IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> linux不同进程使用共享内存及互斥锁 -> 正文阅读

[C++知识库]linux不同进程使用共享内存及互斥锁

linux不同进程使用共享内存及互斥锁

1 共享内存

头文件:

  • #include <sys/shm.h>
  • #include <sys/ipc.h>

1.1 key值

指定一个文件地址,让不同进程可以通过ftok产生同一个key值:

std::string path = ("/home/test.txt");
FILE *fd = fopen(path.c_str(),"a");
fclose(fd);
int key = ftok(path.c_str(), 0);

1.2 创建/获取,映射

shmget通过key创建/获取共享内存id;shmat将共享内存映射到本进程空间;

同个进程最好只shmat一次。

int shm_size = 5000;
int shm_id = shmget(key, shm_size, IPC_CREAT | 0666);
char *shmaddr = (char*)(shmat(shm_id, NULL, 0));

1.3 断开,删除

在进程结束时,需要断开共享内存的映射,或者删除共享内存。

shmdt(shmaddr);//若还有其他进程使用该共享内存,则只断开共享内存映射

shmctl(shm_id, IPC_RMID, NULL);	//删除共享内存

如果强制退出了进程,共享内存只断开连接,不会自己删除共享内存。

可以在命令行输入以下命令:

ipcs -m #查看共享内存

ipcrm -m [shm_id] #删除共享内存

1.4 查看状态

shmctl还可以查看共享内存状态,获取struct shmid_ds结构体内容:

  • shm_cpid:表示该共享内存创建者进程的pid
  • shm_nattch :表示当前该共享内存的连接进程数量
struct shmid_ds shm_status;
shmctl(sm->shm_id, IPC_STAT, &shm_status);

cout<< "shm_status->shm_cpid=" << shm_status.shm_cpid << endl;
cout<< "getpid()=" << getpid() << endl;
cout<< "shm_nattch=" << shm_status.shm_nattch << endl;

因此,想要解决强制退出的内存泄漏问题,可以用这些状态信息来解决:

//在进程开始时,获取共享内存旧状态信息
struct shmid_ds old_shm_status;
int err = shmctl(sm->shm_id, IPC_STAT, &old_shm_status);
//当共享内存依旧存在,且没有进程连接,则删除
if(err == 0 && old_shm_status.shm_nattch == 0){
	shmctl(sm->shm_id, IPC_RMID, NULL);	
}

获取key;
创建shm;
映射地址;

struct shmid_ds shm_status;
shmctl(sm->shm_id, IPC_STAT, &shm_status);
//如果shm的创建者为自身进程,则对shm进程初始化(互斥锁,信号等)
if(shm_status.shm_cpid == getpid()){
	初始化;
}

2 互斥锁

想要在不同进程使用同一个互斥锁,可以把该锁保存在共享内存中,并且需要设置参数初始化:

pthread_mutex_t mutex;

pthread_mutexattr_t mutex_attr;
memset(&mutex_attr, 0, sizeof(pthread_mutexattr_t));
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&mutex, &mutex_attr);	
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:57:07  更:2022-03-11 21:58:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:39:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码