Обработка сигналов и 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, исключаются.