Qt-QSharedMemory qipc文件位置

时间:2019-05-22 10:19:14

标签: qt ipc shared-memory qsharedmemory

在Linux上,使用/tmp时Qt在QSharedMemory目录中创建以下文件:

qipc_sharedmemory_mysharedmem5ffa537fd8798875c98e190df289da7e047c05
qipc_systemsem_mysharedmem5ffa537fd8798875c98e190df289da7e047c05

我遇到了一个问题,其中同一软件的两个不同版本使用这些文件的两个不同位置,从而使它们不兼容。相反,“较新”版本在/tmp/username/目录中创建这些文件。我似乎无法弄清楚是什么原因造成的。这个位置是否由Qt本身定义,如果是,它是否在各个版本之间进行了更改?还是可以由用户以某种方式进行配置,如果可以,则在何处以及如何进行配置?

1 个答案:

答案 0 :(得分:0)

我认为您正在遇到已知的Qt错误,如此处的官方错误跟踪器所述:https://bugreports.qt.io/browse/QTBUG-60771

简而言之,Qt 5.6和Qt 5.8之间的差异在于 QSystemSemaphore (由 QSharedMemory 使用)创建密钥的方式。发现用于创建密钥的方法可能会导致冲突。

有关不兼容的信息,请参见Qt 5.9的变更日志:https://code.qt.io/cgit/qt/qtbase.git/tree/dist/changes-5.9.0/?h=v5.9.0

[QTBUG-60771] Reverted a change that caused Qt 5.6 through 5.8 not to
   connect to QSystemSemaphore and QSharedMemory created by running
   applications using Qt earlier than 5.6. Unfortunately, this means that Qt
   5.9 will not connect to 5.6-5.8.

您可以尝试使用 QSharedMemory :: setNativeKey()方法来强制使用您自己的密钥(并因此强制使用/ tmp目录中的文件名)。尽管这意味着您应该修改和重新编译两个版本的软件。

恐怕“官方”解决方案是确保您当时仅使用一个版本的Qt。