Обработка сигналов и sigemptyset()
Может ли кто-нибудь объяснить в самом деле простой способ понять, что делает sigemptyset()? Почему это полезно? Я прочитал кучу определений, но я просто не понимаю. Из того, что я собираю, он отслеживает сигналы, которые используются для блокировки? Я не совсем уверен, что понимаю, почему это было бы полезно. Неужели мы не получаем рекурсивно этот конкретный сигнал?
Основной пример использования sigemptyset():
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
int main(){
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_handler=function_name;
act.sa_flags=0;
sigaction(SIGINT, &act, 0);
}
Ответы
Ответ 1
sigemptyset
просто инициализирует signalmask
пустым, так что гарантируется, что никакой сигнал не будет замаскирован. (т.е. будут получены все сигналы). В основном это похоже на a memset(0)
, но вам не нужно знать детали реализации. Поэтому, если элемент sa_mask
изменен, вам не нужно настраивать код, потому что он будет позабочен sigemptyset
.
Ответ 2
Сделайте шаг назад. sigset_t
- это конструкция, представляющая несколько сигналов, на которые какое-то действие будет выполняться через некоторый системный вызов (например, sigaction
), но поскольку структура данных, представляющая sigset_t
, непрозрачна, должен быть надежный способ ее инициализации, Локальные переменные в C не инициализируются автоматически, и вы не можете просто предположить, что sigset_t является целым типом и инициализирует его до нуля, потому что это может быть структура или какой-либо другой неизвестный тип. Таким образом, sigemptyset
и sigfillset
предоставляются для надежного пустого (выключить все сигналы) или заполнить (включить весь сигнал) представление sigset_t
.
Ваша реальная путаница может быть тем, что используются для набора сигналов, присущих sigset_t, и ответ на этот вопрос заключается в том, что они используются для нескольких вещей. Вы можете заблокировать несколько сигналов в одном вызове, передав набор для соответствующего вызова. Или вы можете проверить все ожидающие сигналы в одном вызове. Короче говоря, это зависит, но набор позволяет вам работать с несколькими сигналами одним выстрелом, а не последовательным рядом действий - что особенно проблематично с сигналами, потому что они асинхронны и подчиняются всем условиям гонки.
Ответ 3
Название говорит все. sigemptyset()
пустые (переменная, описывающая) набор сигналов.
Это
sigset_t ss;
sigemptyset(&ss);
инициализирует переменную типа sigset_t
(ss
здесь), чтобы "содержать" никаких сигналов.
Из man sigemptyset
(Linux):
sigemptyset() инициализирует набор сигналов, заданный пустым, со всеми сигналами, исключенными из набора.
[...]
Объекты типа sigset_t должны быть инициализированы вызовом либо sigemptyset(), либо sigfillset() перед передачей функции sigaddset(), sigdelset() и sigismember() [...]
Из характеристик POSIX:
int sigemptyset(sigset_t *set);
[...]
Функция sigemptyset() инициализирует набор сигналов, на который указывает набор, так что все сигналы, определенные в POSIX.1-2008, исключаются.