QSharedMemory is not getting deleted on Application crash

杀马特。学长 韩版系。学妹 提交于 2019-12-11 00:29:34

问题


I am implementing an application using Qt C++ where I have used QSharedMemory to restrict multiple instances of the application. Relevant code segment in main.cpp is as follows,

QSharedMemory sharedMemory;
sharedMemory.setKey(SM_INSTANCE_KEY);

if (!sharedMemory.create(1))
{
    QMessageBox::warning(0, "Console", "An instance of this application is already running!" );
    exit(0); /* Exit, already a process is running */
}

On opening the Application, I can see that a shared memory has been created for my application. (shmid 7045192, size 1B)

So far so good. Problem arises when my application crashes for some reason. On crashing, the sharedMemory is not getting cleared, so I can't open the application anymore. When it crashes, attached application count becomes 0, but the shared memory does not get deleted. Relevant screen-shot is as follows

As per as my understanding, as the status of the shared memory is not marked as dest like other shared memories, it is not getting deleted even when there is not any attached process.

So, my question is that is there any way of marking status of the Shared Memory as dest ?


回答1:


Quoting QSharedMemory documentation:

When using this class, be aware of the following platform differences:

Windows: QSharedMemory does not "own" the shared memory segment. When all threads or processes that have an instance of QSharedMemory attached to a particular shared memory segment have either destroyed their instance of QSharedMemory or exited, the Windows kernel releases the shared memory segment automatically.

Unix: QSharedMemory "owns" the shared memory segment. When the last thread or process that has an instance of QSharedMemory attached to a particular shared memory segment detaches from the segment by destroying its instance of QSharedMemory, the Unix kernel release the shared memory segment. But if that last thread or process crashes without running the QSharedMemory destructor, the shared memory segment survives the crash.

HP-UX: Only one attach to a shared memory segment is allowed per process. This means that QSharedMemory should not be used across multiple threads in the same process in HP-UX.

I've add the same issue on Linux few years ago, we solved the problem by doing those steps:

// Pseudo code
if (create_share_memory() == failed)
{
    // The failure may be caused by the shm already existing
    attach()
    detach() // This should delete the shm if no process use it
    if (create_share_memory() == failed)
    {
       // We really cannot create the share memory, report the error
       return failed
    }
}
return ok


来源:https://stackoverflow.com/questions/42549904/qsharedmemory-is-not-getting-deleted-on-application-crash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!