C: что-то делать, когда программа выходит - PullRequest
9 голосов
/ 21 мая 2011

В C, если мое приложение неожиданно заканчивается, могу ли я вызвать функцию до того, как это произойдет? Я пишу флаг в базу данных (processRunning = 1), который не позволяет другим приложениям запускать аналогичный процесс. Когда приложение завершается, оно не меняет этот флаг обратно.

Ответы [ 4 ]

6 голосов
/ 21 мая 2011

загляните в API atexit стандартной библиотеки C.

5 голосов
/ 21 мая 2011

В POSIX правильным решением является защита данных с помощью надежного мьютекса в разделяемой памяти.Если ваш процесс завершился с сохранением надежного мьютекса, другая программа, пытающаяся заблокировать мьютекс, не будет тупиковой, но вместо этого вернет EOWNERDEAD, а затем она сможет очистить состояние, защищенное мьютексом, и вызвать pthread_mutex_consistent.

Редактировать: Если вы хотите запретить запуск нескольких экземпляров программы, есть, конечно, лучшие / более простые способы, такие как блокировка файла базы данных.

4 голосов
/ 21 мая 2011

Если ваше приложение завершается нормально, оно запускает функции, зарегистрированные через atexit.Это стандартная функция, доступная в Windows , unix и любой другой платформе, а также в C ++ .

Обратите внимание, что «завершается нормально»Означает звонки на номер exit() или возвращение с номера main().Если ваше приложение завершается с помощью abort() или _exit(), или если оно было удалено извне, оно может не иметь возможности выполнить какую-либо очистку.Может быть лучший подход, возможно установка и очистка флага в программе-оболочке, которая выполняет очистку независимо от того, как ваша программа завершает свою работу, или вообще отказ от этого флага.

2 голосов
/ 21 мая 2011

Существуют более эффективные способы предотвращения повторного запуска приложения.Одним из решений является использование именованных мьютексов , которые являются общесистемными.Другое и, возможно, более простое решение - заблокировать файл (открытый для записи).Даже в случае сбоя приложения ресурсы освобождаются ОС, и вы сможете снова запустить приложение, поскольку файл или мьютекс больше не будут заблокированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...