什么是进程间通信
进程间通信(Inter-Process Communication,IPC)是指在操作系统中,不同进程之间进行数据交换和共享信息的过程,IPC是一组编程接口,它能够让程序员协调不同的进程,使之能在一个操作系统里同时运行。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有自己的优点和局限性,因此,对于单个程序而言使用所有的IPC方法并不常见。
进程间通信的几种方式
在进程间通信中,存在一些双方都可以访问的介质,这些介质可以用于不同进程之间进行数据交换和通信。以下是一些常见的介质:
共享内存:共享内存是一种进程间通信的方式,允许多个进程访问同一个逻辑内存区域。进程可以通过将数据写入共享内存区域,然后其他进程可以读取这些数据来实现通信和数据共享。
管道(Pipes):管道是一种半双工的通信方式,用于在父子进程或者兄弟进程之间进行通信。管道有两种类型:匿名管道(只能在有亲缘关系的进程之间使用)和命名管道(允许无亲缘关系的进程之间通信)。
消息队列:消息队列是一种进程间通信的方式,允许一个进程向另一个进程发送消息。发送方将消息写入队列,接收方则从队列中读取消息。消息队列提供了一种异步通信的机制。
信号(Signals):信号是一种轻量级的通信机制,用于通知进程发生了某种事件。进程可以发送信号给其他进程,接收方进程可以注册信号处理函数来处理这些信号。
套接字(Sockets):套接字是一种网络通信的方式,也可以用于不同进程之间的通信。进程可以通过套接字在网络上进行数据传输,实现进程间通信。
共享文件:进程可以通过访问共享文件来进行通信。多个进程可以读写同一个文件来交换数据。
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提供了会话管理的支持。会话允许事件传播到进程,例如,当检测到关机时。进程和应用程序可以执行任何必要的操作,例如:保存打开的文档。
Qt Remote Object:这是Qt5.9以后官方推出来的新模块,专门用于进程间通信(IPC)。Qt官方推出的这个新模块是基于Socket来封装的,使用起来非常方便,兼容LPC和RPC。LPC即Local Process Communication,而RPC是指Remote Process Communication,两者都属于IPC。QtRO能够工作于这两种不同的模式:如果用于LPC,则QtRO使用QLocalSocket;如果是用于RPC,则使用QTcpSocket。
Qt Remote Object(QtRO)实现进程间通信——遥控小车(一)_qt remote object例子-CSDN博客