Estoy usando Qt y tratando de lograr una aplicación de instancia única aplicando la solución this en Linux (ubuntu). El problema es que si la aplicación termina inesperadamente (falla segmentada o el usuario la mata), la memoria compartida permanece adjunta y ningún otro proceso puede crearla nuevamente. Recordar de QSharedMemory doc:C++ pérdida de memoria compartida, ¿cómo borrar la memoria compartida?
Unix: QSharedMemory "posee" el segmento de memoria compartida. Cuando el último subproceso o proceso que tiene una instancia de QSharedMemory asociada a un segmento de memoria compartida particular se separa del segmento por destruyendo su instancia de QSharedMemory, el kernel de Unix libera el segmento de memoria compartida . Pero si ese último subproceso o proceso falla sin ejecutar el destructor QSharedMemory, el segmento de memoria compartida sobrevive al bloqueo.
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Ensure single instanse of Cevirgec application
QSharedMemory shared(ApplicationConstants::
if(!shared.create(512, QSharedMemory::ReadWrite))
{
// QMessageBox msgBox;
QMessageBox::critical(0, QObject::tr("application is already running!"), QObject::tr("application is already running!"), QMessageBox::Ok, QMessageBox::Ok);
qCritical() << "application is already running!";
exit(0);
}
else {
qDebug() << "application staring...";
}
return a.exec();
}
¿Qué soluciones puede sugerir aquí? ¿Cómo puedo asegurar que la memoria compartida se borre (o cualquier verbo utilizado en general) después de que el proceso finalmente termine? Necesito algo así como finally
en Java todo alrededor de la función principal:/
EDIT: (Solución)
He conseguido el comportamiento deseado mediante el uso de QSharedMemory y la captura de SIGSEGV luego llamar sharedMemory.detach() en el manejador de señal.
Probablemente no deba tratar de hacer una aplicación que se comporte de manera diferente a como el SO y los usuarios esperan que se comporten las aplicaciones. Si el comportamiento estándar para el sistema operativo es tal que los usuarios esperan poder lanzar varias instancias, como en Windows y Linux, entonces deberían ser capaces de hacerlo. Si el comportamiento estándar es forzar una instancia única, como en Mac, entonces permita que el sistema operativo lo haga cumplir por sí mismo. – bames53
bien, no existe un estándar para tales comportamientos en sistemas operativos. Es totalmente dependiente de la aplicación – destan
bames53: hay toneladas de aplicaciones que solo te permiten iniciar una instancia, y a veces es lo lógico. – rubenvb