Qt利用QFile内存映射实现进程间通信

本文介绍了使用Qt进行进程间通信的方法,重点讲解了通过QFile的map函数进行内存映射文件,以及利用QSystemSemaphore进行进程同步的具体实现。示例代码展示了如何在一对父子进程中实现数据共享。
  • 最近工作上有用到进程通信相关的內容,今天来总结一下,看了网上的大部分内容介绍大体上是通过共享内存来实现,主要是通过QSharedMemory类来访问共享内存,实现共享内存的操作,但是这有个不好的地方就是,当两个进程都detach共享内存时,这个内存就会被回收掉,没法实现类似延时读取的功能。在此,我们可以利用QFile的map函数来进程内存映射文件,其本质上也是模拟共享内存。然后进程间同步呢主要是通过QSystemSemaphore类这个系统级信号量来实现。
  • 涉及到的相关接口
uchar * QFileDevice::map(qint64 offset, qint64 size, MemoryMapFlags flags = NoOptions)
offset是映射起始的偏移量,size是映射的内存大小,flags暂时不用
bool QFileDevice::unmap(uchar * address)
回收映射的内存,这里有一个需要注意的是当这个内存映射的文件对象被销毁或者重新打开一个新的文件时,相关的没有回收映射的内存会被自动回收
  • 下面代码示例一对父子进程的通信
  • 父进程主要代码
QSystemSemaphore g_sem("SemRead", 1, QSystemSemaphore::Create);

QtParentTask::QtParentTask(QWidget *parent)
	: QWidget(parent),ui(new Ui::QtParentTaskClass)
	,m_timer(new QTimer(this))
	,m_fp(nullptr)
{
   
   
	ui->setupUi(this);
	connect(ui->pushButton, &QPushButton::clicked, this, &QtParentTask::startChildProcess);
	connect(m_timer, &QTimer::timeout, this, &QtParentTask::readChildData);

	QDir dir;
	QString dirpath = QDir::tempPath() + "\\QtIPC_test";
	if (!dir.exists(dirpath))
		dir.mkdir(dirpath);
	ui->progressBar->setMaximum(100000);
	//在系统临时文件夹进行临时文件映射
	m_memFile.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值