без перевода его в неблокирующий режим?
Может взять сырой fd у него и в обработчике сигнала сделать то что нужно для этого fd?
Вопрос в том, как прервать блокирующий accept
По идее если грохнуть fd TCP сокета через сискол, то должен как-то отреагировать.
sigterm прервёт работу accept, он завершится с кодом EINTR
Хм, да, работает, Странно, я вчера словил проблему, когда docker не может киллнуть процесс через SIGTERM и оно ждет до SIGKILL
хех, растовский .accept при получении EINTR пробует дальше
Проблема в другом. Процесс с PID=1 должен явно определять хендлеры сигналов, в отличии от всех других, которые просто прибиваются.
И в этом тоже -- попробовал локально, accept из стандартной библиотеки молча съедает eintr и приступает к следующей попытке
но можно использовать крейт https://docs.rs/socket2/0.4.2/socket2/ (там есть конверсия туда-обратно для стандартных примитивов), там accept не обрабатывает никак EINTR
вот пример https://gist.github.com/mexus/29b580d1a553028744dd318b78b5e3bc (на плейграунде всё равно нет нужных крейтов)
Я использую listener.incoming() stream и он прервывается по SIGINT / SIGTERM
он же под капотом один фиг accept делает, который обрабатывает EINTR: https://github.com/rust-lang/rust/blob/master/library/std/src/net/tcp.rs#L1024 щас проверил локально, всё так и есть, incoming при получении сигнала (если, конечно, на сигнале висит обработчик, а не дефолтное поведение "кишками наружу")
Обсуждают сегодня