2013-11-11 4 views
4

Я запускаю цикл epoll, и иногда мой вызов epoll_wait возвращает -1 с errno, установленным в EINTR. Иногда я хочу, чтобы это закончило цикл epoll, как в случае SIGTERM или SIGINT. Но у меня этот код скомпилирован с флагом -pg, поэтому возникают периодические сигналы SIGPROF (27), которые останавливают мой цикл.Определите, какой сигнал вызвал EINTR?

Итак ... можно ли включить подпись, чтобы я мог определить, когда выходить против продолжения? Я хотел бы избежать всего, что использует глобальное, чтобы отслеживать самый последний сигнал.

+0

Хотя в ней по-прежнему используется глобальное событие ['eventfd'] (http://man7.org/linux/man-pages/man2/eventfd. 2.html) или трюк с собственной трубкой может обеспечить довольно чистый способ получения уведомления о сигнале через «epoll», а затем синхронно обрабатывать его на основе signum. –

+0

@Tanner Как я могу использовать это? Сделать epoll_wait игнорировать сигналы, зарегистрироваться для eventfd, обработчик сигнала регистрации, который уведомляет о signum через eventfd? –

+0

В основном я использую трюк [self pipe trick] (http://man7.org/tlpi/code/online/diff/altio/self_pipe.c.html), но общий поток совпадает с «eventfd». Добавьте обработчик сигнала, который записывает в pipe/fd, регистрируется для fd, ждет уведомления о вводе-выводе (продолжите на 'EINTR'), pipe/fd будет готов к чтению и выбору с помощью ввода-вывода, после чего signum можно читать и обрабатывать. –

ответ

1

Добавить обработчики сигналов на SIGTERM и SIGINT. Внутри этих обработчиков вы устанавливаете переменную, которую вы проверяете в своей основной петле epoll.

Смежные вопросы