Set и Oldset в sigprocmask ()

Не имеет прямого отношения к «почему», но чтобы дать ответ на предполагаемое желание сделать это, я хотел бы упомянуть, что стандартная библиотека c ++ 11 имеет тип ссылочной оболочки, чтобы включить это. Он неявно конвертируется в ссылку и хранится в стандартных контейнерах.

25
задан ɢʀᴜɴᴛ 19 July 2017 в 16:31
поделиться

1 ответ

Идея состоит в том, что Вы обеспечиваете маску в [1 110], эффективно список сигналов. how аргумент говорит, что необходимо сделать с маской в [1 112].

можно или использовать SIG_BLOCK для блокирования сигналов в эти set список, или SIG_UNBLOCK для разблокирования их. Ни одно из этих изменений сигналы, которые не установлены в списке. SIG_SETMASK блоки сигналы в списке, и разблокируют тех, которые не установлены в списке.

, Например, предположите, что старый список блокирования был {SIGSEGV, SIGSUSP}, и Вы звоните sigprocmask с этими аргументами:

sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)

новый список блокирования теперь будет {SIGSEGV, SIGSUSP, SIGUSR1}.

, Если Вы звоните sigprocmask с этими аргументами теперь:

sigprocmask(SIG_UNBLOCK, &x, NULL)

новый список блокирования вернется к тому, чтобы быть {SIGSEGV, SIGSUSP}.

, Если Вы звоните sigprocmask с этими аргументами теперь:

sigprocmask(SIG_SETMASK, &x, NULL)

новый список блокирования будет теперь установлен на [1 123].

oldset аргумент говорит Вам, каков предыдущий список блокирования был. Если у нас есть это объявление:

sigset_t y;

и мы называем код в предыдущих примерах как это:

    sigprocmask(SIG_BLOCK, &x, &y)

теперь мы имеем:

y == {SIGSEGV, SIGSUSP}

, Если мы теперь делаем:

    sigprocmask(SIG_UNBLOCK, &x, &y)

мы доберемся

y == {SIGSEGV, SIGSUSP, SIGUSR1}

и если мы делаем:

    sigprocmask(SIG_SET, &x, &y)

мы получим это:

y == {SIGSEGV, SIGSUSP}

, потому что это - предыдущее значение набора блокирования.

72
ответ дан Nathan Fellman 28 November 2019 в 18:05
поделиться
Другие вопросы по тегам:

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