из исходного кода 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, потому что оба метода скроют несколько вхождений сигнала.
Преимущество использования signalfd() заключается в том, что вы можете прочитать структуру signalfd_siginfo и получить много полезной информации о сигнале. – strkol
Недостатком является то, что если несколько детей выходят, прежде чем вы сможете читать из сигнального знака, они будут сжаты в один. Таким образом, информация о других детях будет потеряна. Вы все равно можете получить некоторые бит информации с макросами WIFEXITED и т. Д. ... – Aktau