разница между signalfd и sigwaitinfo?

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

в man-странице написано. Это обеспечивает альтернативу использованию обработчика сигнала или sigwaitinfo (2) и имеет то преимущество, что файловый дескриптор может контролироваться выбором (2), опросом (2) и epoll (7).

  • Детский процесс продолжает работать, если родитель умирает
  • Busybox немедленно завершает печать «SIGUSR1»
  • Почему Bash игнорирует SIGINT, если его текущий управляющий ребенок справляется с этим?
  • Как я могу проверить, какие сигналы прослушивает процесс?
  • выход ограничения на выход И избежать сигнала 13
  • Как определить номера сигналов, используя strace в приложении?
  • Может ли кто-нибудь объяснить мне, что это значит?

  • Telnet отправить Ctrl-C
  • Завершение SSH, вызванное скриптом (обработка SIGPIPE?)
  • Если оболочка запускает программу, будет ли оболочка также получать сигнал SIGINT при нажатии Ctrl + C?
  • Можно ли отправить процессу xpdf сигнал, который заставляет его перезагружать отображаемый файл?
  • bash не выходит из аномального выхода дочернего процесса из-за сигнала
  • Наследование ловушек сигнала Bash
  • 2 Solutions collect form web for “разница между signalfd и sigwaitinfo?”

    Системные вызовы select (2), poll (2) и epoll (7) – это всего лишь способ дождаться событий в дескрипторах файлов (маленькие целые числа, представляющие канал ввода-вывода). События могут включать «чтение данных для чтения», «готовность к записи», подобные вещи. Ваш код составляет набор дескрипторов файлов, которые в конечном итоге будут иметь событие, а затем вызовы select () или poll () или epoll (), чтобы заставить программу ждать, пока не поступят данные, ядро ​​подключает сокет к другому хосту , у дескриптора была ошибка.

    signalfd (2) добавляет новое событие: сигнал достиг. В unix / linux / * BSD «сигнал» является более или менее асинхронным событием: CPU пытался выполнить незаконную инструкцию, I / O готов, код делится на ноль, модем повесил трубку. signalfd (2) позволяет создавать дескриптор файла, который можно использовать в select (), poll (), epoll (), который имеет событие, когда поступает сигнал.

    Раньше вы указывали бы функцию обработчика, которую ядро ​​волшебным образом вызывает при поступлении сигнала (например, «upcall»). Если вы использовали системный вызов sigaction (), чтобы сообщить ядру, какую функцию вы хотите вызвать, вы получите ту же информацию, что и sigwaitinfo ().

    Разница между установкой функции обработчика с сигналом () или sigaction () над signalfd () заключается в том, что функция обработчика может быть вызвана магическим образом в любое время: части вашего кода должны были быть повторными (а не только потокобезопасными, ум вы), чтобы разобраться с характером сигналов в любое время. С signalfd () сигнал – это еще одно событие, которое нужно учитывать в цикле событий вашего кода. Ваш код просто выполняется, как обычно.

    sigwaitinfo () заставляет ваш код останавливаться до тех пор, пока не поступит сигнал, который вы указали. Ваш код ничего не делает, пока этот сигнал не поступит. Нет цикла событий, ничего. Также похоже, что sigwaitinfo () является частью материала реального времени в ядре Linux. sigwaitinfo () можно рассматривать как обозначение места в коде для ядра для вызова при поступлении сигнала, а не в назначении функции для вызова.

    Дополнение:

    Я только что обнаружил сообщение в блоге о «самоуправляемом трюке ». По-видимому, не только неудобно кодовым образом обрабатывать сигналы и выбирать на основе ввода-вывода, вы также можете страдать от «неприятных условий гонки». Собственный трюк оборачивается вокруг этого, делая в основном то, что делает signalfd (2), но все в пространстве пользователя и за счет большего количества кода.

    В ближайшее время: когда вы используете sigwaitinfo (), вы можете ждать только сигналов. Когда вы используете signalfd () в сочетании с poll / select / etc, вы можете дождаться любого события, к которому можно получить доступ через дескриптор файла (файл IO, timerfd, eventfd и т. Д.).

    Linux и Unix - лучшая ОС в мире.