Как сделать уборку после SIGKILL? - PullRequest
8 голосов
/ 29 июля 2010

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

Я использую функцию atexit(), чтобы выполнить очистку, однако, afaik, после получения сигнала SIGKILL, процессы не будут выполнять очистку, поэтому, если какой-либо из этих процессов не завершится нормально, я никогда не смогу очистить память.

Есть ли способ указать, что делать даже после сигнала SIGKILL? Я, вероятно, напишу какой-то механизм, похожий на таймер, чтобы проверить, все ли процессы еще живы, но я бы очень хотел этого избежать, если есть другой способ.

Ответы [ 3 ]

17 голосов
/ 29 июля 2010

Нет, SIGKILL никак не может быть перехвачен вашим приложением - если это возможно, приложение может его игнорировать, что противоречит его цели.

14 голосов
/ 29 июля 2010

Вы не можете поймать SIGKILL.

Однако: вы можете по-прежнему выполнять очистку, при условии, что очистка выполняется другим процессом.Здесь вы можете воспользоваться множеством стратегий, позволяющих вашему служебному процессу видеть, как другие процессы появляются и исчезают.

Например: у вас может быть доменный сокет Unix в известном месте, которое слушает экономка;каждый подчиненный процесс открывает сокет, чтобы указать, что он использует сегмент совместно используемой памяти.Когда раб по какой-либо причине выходит, сокет закрывается.Домработница может видеть, как это происходит, и может делать уборку.

4 голосов
/ 25 июля 2011

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

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