进程间通信#

Qt进程间通信功能的概述

Qt支持许多与同一系统或不同系统中的其他进程进行通信的方式。基本上有三种类型的进程间通信机制

  1. 同步原语

  2. 任意字节级数据的交换

  3. 传递结构化消息

同步原语#

Qt仅提供了一个用于显式进程间同步的类:QSystemSemaphore。一个QSystemSemaphore就像一个多个进程都可以访问的QSemaphore。它在全局上通过“密钥”唯一标识,在Qt中被表示为QNativeIpcKey类。另外,根据操作系统,Qt可能支持多种不同的内存共享后端;有关更多信息和限制,请参阅原生IPC密钥文档。

可以使用位于进程间共享内存区域的普通线程同步原语,如互斥锁、等待条件和读写锁。Qt不提供类来支持这一点,但应用程序可以使用特定操作系统的低级操作。

可以使用其他Qt类提供更高级别的锁定,例如QLockFile,或者通过获取唯一的、全系统范围资源。这些技术包括TCP或UDP端口或D-Bus中的已知名称。

字节级数据共享{{

使用字节级数据,应用程序可以实现任何它们可能选择的通信协议。字节数据的共享可以是面向流的(序列化)或允许随机访问(类似于isSequential()的条件)。

对于串行通信,Qt提供了许多不同的类,甚至完整的模块

  • 管道和FIFOs: QFile

  • 子进程: QProcess

  • 套接字: QTcpSocket, QUdpSocket(在Qt Network中)

  • HTTP(S): QNetworkAccessManager(在Qt Network中)和QHttpServer(在Qt HTTP Server中)

  • CoAP(S): QCoapClient(在Qt CoAP中)

对于同一系统内的随机访问数据共享,Qt提供了QSharedMemory。有关详细信息,请参阅共享内存文档。

结构化消息传递{{

Qt 还提供了一些技术与其他进程交换结构化消息的技术。应用程序可以在上述字节级别解决方案的基础上构建,例如使用 QJsonDocumentQXmlStreamReader / QXmlStreamWriter 通过 HTTP 执行 JSONRPC 或 XMLRPC,或者使用 QtCoAP 的 QCborValue

专门用于结构化消息和远程过程调用的 Qt 模块包括

  • Qt D-Bus

  • Qt 远程对象

  • Qt WebSockets