2016-11-12 8 views
3

В моей программе есть цикл событий, дисциплинированный epoll (для ввода-вывода) и переменные условия (для другой активности сообщения), а также рабочий поток, ответственный за сигналы улавливания (SIGINT, SIGTERM, SIGHUP). SIGINT, SIGTERM, SIGHUP и SIGPIPE заблокированы во всех других потоках.Как я могу прерывать бесконечную sigtimedwait?

Мои epoll_wait вызовы имеют 500мс тайм-аут, но я пытаюсь уменьшить переключение контекста и использовать бесконечное epoll_wait вместо разбужен активности трубы, когда основной поток решает, что пришло время, чтобы выйти из программы и цикл событий должен быть остановлен.

Аналогично, мой вызов sigtimedwait имеет тайм-аут 500 мс (и проверяет std::atomic<bool> после каждого вызова, чтобы посмотреть, нужно ли ему останавливаться), и я хотел бы заменить его тем, что не нужно продолжать проверьте прерывание.

Могу ли я поднять сигнал от основного потока к потоку наблюдения за сигналом, чтобы достичь этого, или что-то в этом роде? Или есть лучший способ поймать сигналы в этот день и в возрасте?

Это на CentOS 6 и 7 (хотя общее решение POSIX было бы предпочтительным — бонусных очков для простого стандарта C++ 11!).

+0

Возможно, это должно быть на [softwareengineering.se]? –

+0

Что такое платформа, Linux? –

+0

@SamVarshavchik: К сожалению, да –

ответ

5

Используйте signal file descriptors, а не обработчики сигналов.

Вместо обработчика сигнала получение сигнала теперь будет выполняться путем чтения из дескриптора файла, который является эпоксидным и может обрабатываться как часть вашего набора эпох.

Да, это лучший способ поймать сигналы, на Linux, в наши дни и в возрасте.

+0

Oooooooooh ..... –

+0

Итак, я должен блокировать сигналы во всех потоках, тогда есть один маскирующий символ 'signalfd' в тех, которые я хочу« поймать »в потоке ввода-вывода? ...хороший! –

+0

Да, а затем вы читаете epoll для чтения и читаете структуру 'struct signalfd_siginfo', которая сообщает вам все, что вы хотели знать о сигнале, но боялись спросить. –