Можете ли вы вызвать signal() из обработчика сигнала?

У меня есть программа супервизора, которая обычно хочет получать SIGCHLD событий. Однако после получения SIGTERM или подобного сигнала было бы безопасно и желательно игнорировать события SIGCHLD, чтобы предотвратить появление зомби. Проблема в том, что я не уверен, разрешено ли вызывать signal(2), когда он уже находится внутри обработчика сигнала, так что, например. SIGTERM звонит signal(SIGCHLD, SIG_IGN). похоже, это не вызывает проблем, но я знаю, что есть много ограничений на то, что вы можете делать в обработчике сигнала, и я не могу понять, находится ли вызов signal в запрещенной зоне. .

Итак: это законно, надежно? Если нет, есть ли альтернативный способ убедиться, что никакие дети, все еще работающие во время SIGTERM, не смогут зомбировать, даже если они не должным образом wait включены?


person Benjamin Pollack    schedule 31.05.2013    source источник


Ответы (1)


Для Linux посмотрите справочную страницу для signal(7). Существует список функций, безопасных для асинхронных сигналов. В нем говорится:

POSIX.1-2004 (также известный как Техническое исправление 2 POSIX.1-2001) требует реализации, гарантирующей, что следующие функции могут быть безопасно вызваны внутри обработчика сигнала:

signal() есть в списке. Так что это безопасно.

person Celada    schedule 31.05.2013