различие между signalfd и sigwaitinfo?

После паузы работы откройте наутилус, работа что-то, и затем:

find ~user/.gconf -mmin -10 -ls
find ~user/.nautilus -mmin -10 -ls

который найдет файлы, измененные за прошлые 10 минут.

5
05.06.2012, 20:07
2 ответа

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

signalfd (2) добавляет новое событие: сигнал прибыл. В unix/linux / *BSD "сигнал" более или менее асинхронное событие: ЦП пытался выполнить запрещенную команду, ввод-вывод готов, код, разделенный на нуль, модем завис. signalfd (2) позволяет Вам создать дескриптор файла, применимый в выборе (), опрос (), epoll (), который имеет событие, когда сигнал прибывает.

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

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

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

Дополнение:

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

9
27.01.2020, 20:36
  • 1
    К вашему сведению для любого, кто мог бы обратиться к этому в будущем: sigwait() и sigwaitinfo() предназначаются, чтобы использоваться с потоками - действительно, специализированный поток для всей обработки сигнала должен использовать один из этих вызовов, чтобы "получить" асинхронные сигналы и затем передать любую информацию другому потоку (потокам) способом, который имеет смысл для другого потока (потоков), возможно, с помощью pthread_cond_signal() или pthread_cond_broadcast(), или путем введения событий в любую очередь сообщений используется основным потоком обработки событий, и т.д. –  Greg A. Woods 18.10.2015, 22:52

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

0
27.01.2020, 20:36

Теги

Похожие вопросы