2012-05-03 2 views
2

Это несколько вопросов, связанных с соответствующим вопросом. Я нашел here.libevent & signal handling (SIGCHLD специально)

В связанном вопросе упоминается использование signalfd() и использование этого fd с помощью libevent. В этом вопросе ОП не перечисляет, почему он использует signalfd(), в отличие от средств обработки сигналов libevent.

В обоих методах вы будете обрабатывать обратный вызов вне обработчика сигнала.

This documentation, похоже, предупреждает о таймере планирования в обратном вызове сигнала. Что не кажется правильным (поскольку мы были бы вне контекста обработчика сигнала). Помимо упомянутого предупреждения, я не вижу преимущества для этого с signalfd().

Любой ввод о разнице между этими двумя методами или о предупреждении

Спасибо!

+1

Преимущество использования signalfd() заключается в том, что вы можете прочитать структуру signalfd_siginfo и получить много полезной информации о сигнале. – strkol

+0

Недостатком является то, что если несколько детей выходят, прежде чем вы сможете читать из сигнального знака, они будут сжаты в один. Таким образом, информация о других детях будет потеряна. Вы все равно можете получить некоторые бит информации с макросами WIFEXITED и т. Д. ... – Aktau

ответ

2

из исходного кода Libevent (в v2.0.19 стабильный)

/* signal.c

Это осуществление сигнала обработки мы используем для движков, что нет лучшего способа для обработки сигналов. Он использует sigaction() или сигнал(), чтобы установить обработчик сигнала, и пару сокетов сказать базу события, когда

Обратите внимание, что я сказал «базовое событие»: только одна базы события может быть установлен вверх использовать это за раз. По историческим причинам и обратно совместимость, если вы добавили событие для сигнала в event_base A, , затем добавьте событие для сигнала (любой сигнал!) В event_base B, event_base B получит информацию о сигнале, но event_base A не будет.

Было бы здорово изменить это поведение в следующей версии Libevent. kqueue уже делает что-то гораздо более разумное. Мы можем сделать все бэкэнды на Linux, сделать разумную вещь, используя signalfd. */

так прямо сейчас Libevent использует sigaction(), если он доступен, и, в противном случае, сигнал().

Если вы используете signalfd(), вы обычно блокируете сигнал с помощью sigprocmask, чтобы сигналы не вызывали выполнение обработчиков по умолчанию. то вы можете контролировать возвращенный дескриптор файла с помощью libevent и безопасно обрабатывать сигнал от обычного синхронного кода, не беспокоясь о безопасности памяти или блокируя или прерывая другие системные вызовы.

Существуют ограничения на то, что вы можете безопасно выполнять внутри классических асинхронных обработчиков сигналов (т. Е. Зарегистрированных с использованием sigaction). См. «Асинхронные сигнальные функции» в человеческом сигнале. Используя подход signalfd, эти ограничения значительно уменьшаются.

предупреждение о регистрации обратного вызова по таймеру, скорее всего, было вызвано опасностью, поскольку libevent поддерживает так много платформ, и по крайней мере один человек сообщил о проблемах. обратите внимание, что если вы выбираете/проверяете файл, зарегистрированный signalfd, тогда вам не нужно беспокоиться об этом ограничении.

EDIT: я перечитываю ваш вопрос и понял, что я действительно не ответил на него должным образом. преимущество регистрации signalfd, а затем использование этого в libevent заключается в том, что он быстрее за счет переносимости. были запланированы (http://archives.seul.org/libevent/users/Mar-2010/msg00046.html), чтобы включить signalfd в libevent, но AFAIK пока этого не произошло.

также, как только вы получили уведомление о SIGCHLD, вы должны всегдазывать waitpid в цикле до тех пор, пока не получите ENOCHLD, потому что оба метода скроют несколько вхождений сигнала.

+0

Полностью соглашайтесь/понимаем цикл слияния/'waitpid', а одна база событий может принимать события сигнала и, следовательно, выгоду' signalfd' , Но я все же думаю, что если есть платформы, среды, в которых сигнальные события не могут выполняться в цикле диспетчера, и/или другие события не могут быть запланированы/добавлены, что сигнальные события должны быть отключены на этих платформах (можете ли вы сказать, что мне не понравилось предупреждение ? :)). Благодаря! – nhed

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