On Thu, Sep 28, 2023 at 11:30:47PM +0300, Andrey Jr. Melnikov wrote:
> Max Nikulin <maniku...@gmail.com> wrote:
> > Послать-то сигнал может и просто, а вот правильно поймать уже некоторое 
> > искусство. Чинить обработчики сигналов - трудоемкий процесс. За это я 
> > сигналы не люблю.
> Вот и не надо перекладывать свои "люблю-нелюблю" на всех. Сигналы -
> хорошее, правильное асинхронное средство донести до процесса необходимую
> информацию. 

 Информация там очень скудна, по сути исчерпывается списком сигналов
 (с некоторыми вольностями в трактовке, включая USR1/USR2).

> > С сокетами проще. Если есть утилита и библиотека, которые могут слать 
> > нужные сообщения, и процесс их может правильно обработать, то это лучше, 
> > чем сигналы. Мне такой вариант нравится больше.
> Проще? Создать сокет, открыть сокет, крутить select() в цикле, обрабатывать
> ошибки, прочитать сокет (если прочитается), закрыть сокет.. и это все вместо 
> одного signal handler?

 Ой, не надо сказки про "один signal handler"... Он один, когда нужно
 застрелицца. Да и то если твоя прога ничего полезного не делает, так что
 может просто не обрабатывать этот сигнал. А во всех нетривиальных случаях
 хэндлер может лишь поставить флаг в переменной, описанной как sig_atomic_c
 (static volatile ...) и вернуться через sigreturn(). Потому как любое
 действие, затрагивающее libc, грозит разносом стэка, и вообще во время
 обработки сигнала сплошь минные поля. А когда из сигхэндлера вернулся,
 нужно как-то мониторить тот факт, что тебе пришёл сигнал, т.е. рядом
 с poll/select будет ещё вычитывание той переменной, с флагом. Когда же она
 вычитана и мы знаем, что сигнал получен, встанет отдельный квест, как
 эту переменную безопасно вычистить, чтобы не потерять повторный сигнал,
 который может придти именно в момент очистки. Такое вполне может быть,
 если это не SIGTERM, который обычно одиночный и повторение которого
 ничего не меняет.

 По сравнению с этим добавление в poll/select одного сокета, на котором
 принимаются команды управления, это просто детская задачка.

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

Ответить