Каково соотношение и различие между маской сигналов и набором сигналов? - PullRequest
0 голосов
/ 31 мая 2018

С APUE

Каждый процесс имеет маску сигналов , которая определяет набор сигналов, в настоящее время заблокированных от доставки этому процессу.Мы можем думать об этой маске как о наличии одного бита для каждого возможного сигнала.Если для данного сигнала бит включен, этот сигнал в настоящее время блокируется.Процесс может проверить и изменить свою текущую маску сигналов, вызвав sigprocmask , который мы опишем в разделе 10.12.

Поскольку число сигналов в битах может превышать число бит вцелое число POSIX.1 определяет тип данных, называемый sigset_t, который содержит набор сигналов .Например, маска сигнала сохраняется в одном из этих наборов сигналов.Мы описываем пять функций, которые работают с наборами сигналов в Разделе 10.11.

Каково отношение и различие между маской сигналов и набором сигналов?

сигнал представляет собой элемент данных и является ли сигнал набором объекта, поскольку элемент данных хранится в объекте?

В чем заключаются различия и когда мы будем использовать какие:

#include <signal.h>
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);

и

#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Маска сигналов - это атрибут процесса, список сигналов, которые заблокированы.sigprocmask извлекает и / или обновляет этот атрибут процесса.

Набор сигналов - это тип данных, который содержит список номеров сигналов.sigaddset и sigdelset используются для изменения объекта, содержащего эти данные.

Если вы хотите установить или получить маску сигналов процесса, системный вызов sigprocmask() принимает параметр, тип которого sigset_t* для хранения указателя на этот список.

Это аналогично связи между идентификаторами процесса и pid_t.

Так что если вы хотите изменить маску сигналов процесса, вы можетевыполните следующие действия:

  1. Вызовите sigprocmask() с нулевым set и ненулевым oset параметром, чтобы получить маску текущего процесса в переменной sigset_t.
  2. Вызовите sigaddset() и / или sigdelset(), чтобы добавить и удалить сигналы из этой переменной.
  3. Вызовите sigprocmask() с how = SIG_SETMASK и set, содержащими обновленный набор сигналов.

Если вы просто хотите добавить или удалить сигналы из маски, но не оба, вы можете использовать операции SIG_BLOCK и SIG_UNBLOCK, чтобы сделать это за один вызов sigprocmask.Просто создайте набор сигналов, содержащий сигналы, которые вы хотите добавить или удалить, и они будут объединены с существующей маской.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...