共享内存(shared memory):
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
QLocalSocket(单机器)
QTcpSocket(跨机器)
Qt进程通信:
在Qt应用程序中,Qt提供了几个方法来实现进程间通信(IPC)。可以在助手中查找关键字”Inter-Process”进行查找。
TCP/IP
跨平台的Qt Network模块提供的类可以让网络编程更加便携和方便。它提供了高级类(例如:QNetworkAccessManager、QFtp)通信,使用特定的应用程序级协议,和较底层的类(例如:QTcpSocket、QTcpServer、QSslSocket)用于实现协议。
Shared Memory
跨平台的QSharedMemory-共享内存类,提供对操作系统的共享内存的实现。它允许多个线程和进程安全访问共享内存段。此外,QSystemSemaphore可以用来控制访问由系统共享的资源,以及进程之间的通信。
D-Bus
Qt的D-Bus模块是一种可用于使用D-Bus协议实现IPC的唯一Unix库。它将Qt的信号和槽机制延伸到IPC级别,允许由一个进程发出的信号被连接到另一个进程的槽。Qt的D-Bus文档已经详细说明如何使用Qt中的D-Bus模块。
QProcess
跨平台类QProcess可以用于启动外部程序作为子进程,并与它们进行通信。它提供了用于监测和控制该子进程状态的API。另外,QProcess为从QIODevice继承的子进程提供了输入/输出通道。
Session Management
在Linux/X11平台上,Qt提供了会话管理的支持。会话允许事件传播到进程,例如,当检测到关机时。进程和应用程序可以执行任何必要的操作,例如:保存打开的文档。
--------QSharedMemory共享内存
setKey("")设置共享内存标识符
create(int size, AccessMode mode = ReadWrite)创建共享内存,设置大小,访问模式
attach()读数据之前进入共享内存
deatch()释放共享内存
isAttach()是否有进程进入该共享内存区域
写数据流程:
1、对象setkey绑定共享内存
2、detach()和主进程分离
3、create()像OS申请内存
4、qsharedmemory->lock(); //锁定共享内存
5、写数据
char *to = (char*)qsharedmemory->data(); //获取共享内存中的地址
memcpy(to, from, qMin(qsharedmemory->size(), size)); //将缓冲区中的数据复制到共享内存。取最小是可能图片size小,共享内存占不满,也可能会图片太大超过共享内存。
6、qsharedmemory->unlock(); //释放共享内存
读数据流程:
1、对象setkey绑定共享内存
2、qsharedmemory->lock(); //锁定共享内存
3、 bool res = sharedMem.attach(QSharedMemory::ReadOnly);
4、const char *from = buffer.data().data(); //获取有效数据在缓冲区中的地址
5、unlock操作释放权限
优点:共享内存的优点: 效率高。
缺点:共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作
--------QSharedMemory共享内存