2013-12-19 4 views
14

Может ли кто-нибудь объяснить в самом деле простой способ понять, что делает 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); 

} 

ответ

19

sigemptyset просто инициализирует signalmask пустым, так что гарантируется, что сигнал не будет замаскирован. (то есть все сигналы будут получены) В основном это похоже на memset(0), но вам не обязательно знать подробности реализации. Поэтому, если член sa_mask изменен, вам не нужно настраивать код, потому что он будет позабочен sigemptyset.

2

Название говорит все это. sigemptyset() Пустыни (переменная, описывающая) набор сигналов.

Это

sigset_t ss; 
sigemptyset(&ss); 

инициализирует переменную типа sigset_t (ss здесь), чтобы "содержать" нет сигналов.

От man sigemptyset (Linux):

sigemptyset() инициализирует набор сигналов заданного набора для пустых, со всеми сигналами исключены из набора.

[...]

Объекты типа sigset_t должны быть инициализированы с помощью вызова либо sigemptyset() или sigfillset() перед передачей функций sigaddset(), sigdelset() и sigismember() [...]

от POSIX specs:

int sigemptyset(sigset_t *set); 

[...]

sigemptyset() функция инициализирует набор сигналов, на который указывает набор, таким образом, чтобы все сигналы, определенные в POSIX.1-2008 исключены.

+0

* Название говорит все это * - ну на самом деле это довольно плохое имя в этом случае. Его следует называть sigset_empty или что-то еще. – Pithikos

+0

Нет, но возможно 'sig_emptyset'. Подавляющее большинство функций, определенных в 'signal.h' в POSIX, имеют префикс' sig', чтобы указать это. Таким образом, 'sigemptyset' является реализацией' signal.h' для пустого набора. – stefanct

3

Сделайте шаг назад. sigset_t - это конструкция, которая представляет собой несколько сигналов, на которые какое-то действие будет выполняться через некоторый системный вызов (например, sigaction), но поскольку структура данных, представляющая sigset_t, непрозрачна, должен быть надежный способ ее инициализации. Локальные переменные в C не инициализируются автоматически, и вы не можете просто предположить, что sigset_t является целым типом и инициализирует его до нуля, потому что это может быть структура или какой-либо другой неизвестный тип. Таким образом, sigemptyset и sigfillset предназначены для надежного опорожнения (выключите все сигналы) или заполните (включите весь сигнал) представление sigset_t.

Ваша реальная путаница может быть тем, что используются для набора сигналов, присущих sigset_t, и ответ на них заключается в том, что они используются для нескольких вещей. Вы можете заблокировать несколько сигналов в одном вызове, передав набор для соответствующего вызова. Или вы можете проверить все ожидающие сигналы в одном вызове. Короче говоря, это зависит, но набор позволяет вам работать с несколькими сигналами одним выстрелом, а не последовательным рядом действий - что особенно проблематично с сигналами, потому что они асинхронны и подчиняются всем условиям гонки.

Смежные вопросы