![]() |
|
|
![]()
|
|
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
Мне надо сделать защиту от множественного запуска приложения, работающего под линуксом (убунту) пробую так:
Вроде бы все работает верно, но только если я закрываю приложение крестиком на главной форме приложения (код завершения приложения "0")... если же я закрываю приложение через кнопку "Остановить" qt-креатора или по ctrl/c (при запуске из терминала), т.е. с кодом завершения приложения "1", то созданный sharedMemory "не убивается" при выходе из приложения и соответственно больше не запускается (выполняется exit(1))...так как же мне "убивать" созданный sharedMemory при "аварийном" выходе программы??? под виндой такой проблемы почему-то нет... |
|||
|
||||
| Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
Мож попробовать так?
По поводу закрытия ... если прописать свой обработчик?
|
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
нет, QtSingleApplication - это сторонний класс, мне же надо решить мой вопрос стандартными qt-ми средствами...так в том-то и вопрос - как убить sharedmemory и как убить в Mainwindow sharedmemory, созданный в main? и все равно closeEvent не вызывается при аварийном выходе...
Это сообщение отредактировал(а) gordmiand - 9.12.2013, 21:42 |
|||
|
||||
| Majestio |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
С разделяемой памятью - видимо засада. Судя по описанию, в Sytem V - ею владеет система, а не процесс. И при вылете она остается залоченой. Пол линухом нет возможности поэксперементировать, может такое поможет:
А вообще, думаю, лучше этот вопрос решать через .pid-файлы и flock, например: 1) Программа запускается смотрит ли есть /var/run/программа.pid (размещение для FreeBSD, в линухе не помню) 2) Если нет - создает pid-файл, флокает его, записывает в него свой PID (снимает блокировку?) 3) Если есть - ищет PID среди запущенных процессов, если нет - jmp п.2 4) Если есть среди запущеных - выход или активация той запущеной копии |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 3 Всего: 56 |
Этот класс, насколько я помню, в своё время сделан самими Trolltech. Если уже совсем не хочется его использовать, то можно посмотреть как он сделан. Если мне память не изменяет, то он построен на сокетах. |
|||
|
||||
| gordmiand |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
нашел статью про однократный запуск приложения, в нем приводится такой пример
по нему у меня 2 вопроса: 1. зачем нужна переменная isRunning, если она не используется 2. что подразумевается под Unique name1 и Unique name2? первое - наверное имя программы, количество запусков которой я хочу контролировать, а Unique name2? в этой же статье прочитал, что "если в результате аварийного завершения предыдущего экземпляра приложения осталась неразруженая разделяемая память с нулевым (фактически) счетчиком ссылок подсоединение к ней и немедленное отсоединение разрушит эту память. А если счетчик ссылок ненулевой — он останется прежним." поэтому в свой пример (в самом начале темы) после создания экземпляра sharedMemory делаю
тогда вроде бы все работает, но не совсем мне понятно почему - т.е. attach-detach убивает ранее созданную память, но это надо бы делать после выхода (любого) из программы, но где это писать при аварийном выходе - непонятно... |
||||
|
|||||
| Majestio |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 19.12.2010 Репутация: нет Всего: нет |
К сожалению, пока нет времени разбираться, хотя вопрос достаточно интересен.
Бегло глянул инфу в сети, и нашел, на мой взгляд интересные статьи. Надеюсь помогут: 1) О команде просмотра всех объектов System V IPC, и не только - тырк здесь 2) Знакомство с межпроцессным взаимодействием на Linux - тырк здесь Конечно просьба: как появится законченное решение - опубликовать его с комментариями тут ЗЫ: Ну и пожелание ... раз уж речь ведем о кросспратворменной среде разработки - предусмотреть реализацию и для Win & Mac, по возможности. Если что, готов потестить. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
Я не понял, а чем не нравится вариант с QtSingleApplication? Там уже все сделано и отлажено! Достаточно скопировать себе несколько файликов из архива.
|
|||
|
||||
| gordmiand |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 772 Регистрация: 15.4.2007 Репутация: нет Всего: 0 |
QtSingleApplication - класс может и хорош сам по себе, но таскать несколько "лишних" файлов не хочется...можно же решить такой вопрос и qt-ми средствами...например вариант с shared memory и семафором додумать до конца...
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |