pthread_sigmask -
проверяет
и изменяет
маску
заблокированных
сигналов
POSIX threads library (
libpthread,
-lpthread)
#include <signal.h>
int pthread_sigmask(int how, const sigset_t *set, sigset_t *oldset);
pthread_sigmask():
_POSIX_C_SOURCE >= 199506L || _XOPEN_SOURCE >= 500
Функция
pthread_sigmask()
подобна
sigprocmask(2), но
используется
в
многонитевых
программах,
что явно
указано в POSIX.1.
Другие
отличия
приведены
в этой
странице.
Описание
аргументов
и работы
функции
смотрите в
sigprocmask(2).
При
успешном
выполнении
pthread_sigmask()
возвращается
0; при ошибке
возвращается
номер
ошибки.
Смотрите
sigprocmask(2).
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
pthread_sigmask() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Новая нить
наследует
копию
маски
сигналов
своего
создателя.
Функция glibc
pthread_sigmask() просто
игнорирует
попытки
блокирования
двух
сигналов
реального
времени,
которые
используются
внутри
реализации
NPTL.
Подробности
смотрите в
nptl(7).
Показанная
далее
программа
блокирует
некоторые
сигналы в
главной
нити, а
затем
создаёт
отдельную
нить для
получения
этих
сигналов с
помощью
sigwait(3).
Пример
работы
программы:
$ ./a.out &
[1] 5423
$ kill -QUIT %1
Нить обработки сигналов получила сигнал 3
$ kill -USR1 %1
Нить обработки сигналов получила сигнал 10
$ kill -TERM %1
[1]+ Terminated ./a.out
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* Простая функция обработки сигналов */
#define handle_error_en(en, msg) \
do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void *
sig_thread(void *arg)
{
sigset_t *set = arg;
int s, sig;
for (;;) {
s = sigwait(set, &sig);
if (s != 0)
handle_error_en(s, "sigwait");
printf("Нить обработки сигналов получила сигнал %d\n", sig);
}
}
int
main(void)
{
pthread_t thread;
sigset_t set;
int s;
/* Блокируем SIGQUIT и SIGUSR1; нити, созданные main(),
унаследуют копию маски сигналов. */
sigemptyset(&set);
sigaddset(&set, SIGQUIT);
sigaddset(&set, SIGUSR1);
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&thread, NULL, &sig_thread, &set);
if (s != 0)
handle_error_en(s, "pthread_create");
/* Main thread carries on to create other threads and/or do
other work. */
pause(); /* Просто пауза, чтобы мы могли протестировать
программу */
}
sigaction(2),
sigpending(2),
sigprocmask(2),
pthread_attr_setsigmask_np(3),
pthread_create(3),
pthread_kill(3),
sigsetops(3),
pthreads(7),
signal(7)
Русский
перевод
этой
страницы
руководства
был сделан
Alexey, Azamat Hackimov <
[email protected]>, kogamatranslator49
<
[email protected]>, Kogan, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]> и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]