那么,关于应用程序崩溃的QSharedMemory究竟有什么协议?

时间:2016-01-27 09:54:52

标签: c++ linux qt shared-memory

当使用QSharedMemory的Qt应用程序崩溃时,某些内存句柄会卡在系统中。 <推荐“摆脱它们的方法是

if(memory.attach(QSharedMemory::ReadWrite))
    memory.detach();
bool created = memory.create(dataSize, QSharedMemory::ReadWrite);

理论上,上面的代码应该是这样的:

我们附加了一个左侧的记忆,从它上面分离,它检测到我们是最后一个活着的用户并且优雅地下降。

除了......这不是很多情况下发生的事情。我真正看到的事情很多,就是:

// fails with memory.error() =  SharedMemoryError::NotFound
memory.attach(QSharedMemory::ReadWrite);
// fails with "segment already exists" .. wait, what?! (see above)
bool created = memory.create(dataSize, QSharedMemory::ReadWrite);

我找到的解决这个问题的唯一有点工作方法是在包含当前正在运行的应用程序的pid的应用程序启动时编写一个pid文件。 下次运行相同的应用程序时,它会选择此文件并执行

//QProcess::make sure that PID is not reused by another app at the moment
//the output of the command below should be empty
ps -p $previouspid -o comm=
//QProcess::(runs this script, reads output)
ipcs -m  -p | grep $user | grep $previouspid | sed "s/  / /g" | cut -f1 -d " "
//QProcess::(passes the result of the previous script to clean up stuff)
ipcrm -m $1

现在,我可以自己看到这种方法存在的问题,但唯一有效的方法

问题是:有人可以向我解释一下这笔交易到底是什么,而不是上面第一段代码中的现有内存以及如何正确处理它?<​​/ p>

0 个答案:

没有答案