SirNaFigator
@SirNaFigator
Программист

Конфликт socket_select() и системных сигналов SIGUSR1, SIGUSR2?

Добрый день уважаемые гуру, крайне прошу вашего совета куда копать.

Вооружившись статьей habrahabr.ru/post/134620 собрал я демона на PHP который вполне себе успешно слушает системные сигналы и все было хорошо пока демону не понадобилось слушать сокеты (у менеджеров на страничку в реальном времени улетает лог действий + принимаются команды для демона)

Так вот проблема не однозначна:
по отдельности все работает, когда демон не работает с сокетами он прекрасно отрабатывает сигналы и наоборот демон прекрасно работает с сокетами пока не идут сигналы.
А вот когда во время работы с сокетами начинают идти сигналы демон может бесшумно упасть (без записей в лог и ошибок), причем упасть он может на произвольной итерации, т.е. первые 3 сигнала отрабатывают, а на 4 - падение. Или первые 12 отрабатывают и снова падает. Может упасть и с первой попытки.

Экспериментальным путем выяснилось, что падает демон на функции socket_select().

Google не помогает в решении проблемы.
Среда: Ubuntu Server 12.04, PHP 5.4 с необходимыми модулями вроде PCNTL
Сам демон работает с MySQL базой и memcached + Frontend на Javascript WebSocket
  • Вопрос задан
  • 2544 просмотра
Пригласить эксперта
Ответы на вопрос 1
@billyevans
А зачем вам обрабатывать сигналы вообще ? Это древняя хрень, которую лучше использовать по минимуму. Я вообще не уверен, что высокоуровневые языки могут адекватно обрабатывать сигнал. Ну то есть, например, в обработчике сигнала происходит создание какого-то объекта, с аллокацией в куче и в момент malloc() прилетает еще один сигнал, дальше он идет опять в malloc() и очень легко может выйти deadlock, или еще куча всякого подобного где происходит какая-то сложная деятельность с локами или захватом всяких ресурсов в обработчиках сигналов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы