Очистка общих объектов POSIX при завершении / смерти процесса - PullRequest
4 голосов
/ 10 ноября 2009

Есть ли способ выполнить очистку общих объектов синхронизации POSIX, особенно при сбое процесса? Разблокировка заблокированных семафоров POSIX является наиболее желательной вещью, но автоматически «собранные» очереди / область совместно используемой памяти также подойдут. Еще одна вещь, на которую стоит обратить внимание, - мы вообще не можем использовать обработчики сигналов из-за SIGKILL, который не может быть пойман.

Я вижу только одну альтернативу: некоторый внешний демон, который принимает подписки и запросы keep-alive, работает как сторожевой таймер, поэтому не имеет уведомлений о каком-либо объекте, который может закрыть / разблокировать объект в соответствии с зарегистрированной политикой.

Есть ли у кого-нибудь лучшая альтернатива / предложение? Раньше я никогда серьезно не работал с общими объектами POSIX (сокетов было достаточно для всех моих потребностей и, по моему мнению, гораздо полезнее), и я не нашел ни одной подходящей статьи. Я бы с радостью использовал здесь сокеты, но не могу по историческим причинам.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Вместо того чтобы использовать семафоры, вы можете использовать блокировку файлов для совместной обработки ваших процессов. Большим преимуществом блокировок файлов является то, что они освобождаются, если процесс завершается. Вы можете отобразить каждый семафор на блокировку для байта в общем файле и знать, что блокировки будут освобождены при выходе; в большинстве версий unix блокируемые вами байты даже не должны существовать. Код для этого есть в книге Марка Рочкинда «Расширенное программирование Unix», 1-е издание, хотя не знаю, вошло ли оно в последнее 2-е издание.

3 голосов
/ 08 февраля 2012

Я знаю, что этот вопрос старый, но другое отличное решение - надежные мьютексы POSIX. Они автоматически разблокируются и переходят в состояние «несоответствующий флаг», когда владелец умирает, и следующий поток, пытающийся заблокировать мьютекс, получает ошибку EOWNERDEAD, но успешно становится новым владельцем мьютекса. Затем он может очистить любое состояние, которое защищал мьютекс (который может быть в очень плохом несовместимом состоянии из-за асинхронного завершения предыдущего владельца!), И пометить мьютекс как непротиворечивый перед разблокировкой.

См. Документацию по надежным мьютексам здесь:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html

2 голосов
/ 10 ноября 2009

Обычным способом является работа с обработчиками сигналов . Просто поймайте сигналы и вызовите функции очистки.

Но у вашего сторожевого демона тоже есть свои достоинства. Это, безусловно, сделает систему более простой для понимания и управления. Чтобы упростить администрирование, ваше приложение должно запустить демон, когда он не запущен, и демон должен быть в состоянии очистить все остатки от последнего сбоя.

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