Sto utilizzando Qt e sto cercando di ottenere un'applicazione a singola istanza applicando la soluzione this in Linux (ubuntu). Il problema è che se l'applicazione termina inaspettatamente (errore di divisione o utente lo uccide) la memoria condivisa rimane collegata e nessun altro processo può crearla nuovamente. Richiamo da QSharedMemory doc:Perdita di memoria condivisa in C++, come cancellare la memoria condivisa?
Unix: QSharedMemory "possiede" il segmento di memoria condivisa. Quando l'ultimo thread o processo con un'istanza di QSharedMemory collegata a un segmento di memoria condiviso specifico si stacca dal segmento per distruggendo l'istanza di QSharedMemory, il kernel Unix rilascia il segmento di memoria condivisa . Ma se l'ultimo thread o processo si blocca senza eseguire il distruttore QSharedMemory, il segmento di memoria condivisa sopravvive all'incidente.
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();
}
Quali soluzioni si può suggerire qui? Come posso assicurare che la memoria condivisa sia cancellata (o qualunque verbo usato in generale) dopo che il processo finisce. Ho bisogno di qualcosa come finally
in Java tutto la funzione principale:/
EDIT: (Soluzione)
ho raggiunto il comportamento desiderato utilizzando QSharedMemory e la cattura del segnale SIGSEGV quindi chiamare sharedMemory.detach() in il gestore del segnale.
Probabilmente non dovresti provare a realizzare un'app che si comporta in modo diverso da come il sistema operativo e gli utenti si aspettano che le app si comportino. Se il comportamento standard per il sistema operativo è tale che gli utenti si aspettano di essere in grado di avviare più istanze, come su Windows e Linux, dovrebbero essere in grado di farlo. Se il comportamento standard è quello di forzare una singola istanza, come nei Mac, quindi lasciare che il sistema operativo lo faccia da sé. – bames53
beh, non esiste uno standard per tali comportamenti nei sistemi operativi. È totalmente dipendente dall'applicazione – destan
bames53: ci sono tantissime app che ti permettono solo di avviare un'istanza, ea volte è la cosa più logica da fare. – rubenvb