Лекции по курсу "Системное программирование для UNIX". Литвинов Д.Г. - 28 стр.

UptoLike

Составители: 

28
Функция проверяет входит ли сигнал SIGNUM в набор сигналов SET.
Возвращает 1, если сигнал находится в наборе и 0 в противном случае, -1 – в случае
ошибки выполнения. При возникновении ошибки переменная errno может принимать
следующее значение:
EINVAL SIGNUM содержит неправильный номер сигнала.
Набор сигналов, который заблокирован в данный момент, называетсямаской
сигналов”. Каждый процесс имеет свою собственную маску сигналов. При создании
нового процесса, он наследует маску сигналов родительского процесса. Для
модификации маски сигналов используется следующая функция:
int sigprocmask(int HOW, const sigset_t *SET,
sigset_t *OLDSET)
Аргумент HOW определяет каким образом изменяется маска сигналов и может
принимать следующие значения:
SIG_BLOCK сигналы, задаваемые в наборе, блокируются добавляются к уже
существующей маске сигналов;
SIG_UNBLOCK сигналы, задаваемые в наборе, разблокируютсяудаляются из
уже существующей маски сигналов процесса;
SIG_SETMASK устанавливает набор сигналов для процесса, старое содержимое
маски игнорируется.
Аргумент OLDSET используется для возврата старого содержимого маски
сигналов процесса.
Функция возвращает 0 в случае успеха и –1 в противном случае. При
возникновении ошибки переменная errno может принимать следующее значение:
EINVAL SIGNUM содержит неправильный номер сигнала.
Для проверки того, обработчики каких сигналов активны в настоящий момент
используется следующая функция:
int sigpending(sigset_t *SET)
Функция возвращает информацию об активных в текущий момент сигналах.
Если имеется заблокированный сигнал, поступивший процессу, то он также включается
в маску сигналов. Возвращает 0 в случае успешного выполнения и –1 в случае ошибки.
Пример проверки активных сигналов:
#include <signal.h>
#include <stddef.h>
sigset_t base_mask, waiting_mask;
sigemptyset (&base_mask);
sigaddset (&base_mask, SIGINT);
sigaddset (&base_mask, SIGTSTP);
/* Блокировка прерываний пользователя */
sigprocmask (SIG_SETMASK, &base_mask, NULL);
...
sigpending (&waiting_mask);
if (sigismember (&waiting_mask, SIGINT)) {
/* Попытка прекратить выполнение процесса */
}
else if (sigismember (&waiting_mask, SIGTSTP)) {
/* Попытка остановить выполнения процесса */
}
       Функция проверяет входит ли сигнал SIGNUM в набор сигналов SET.
Возвращает 1, если сигнал находится в наборе и 0 в противном случае, -1 – в случае
ошибки выполнения. При возникновении ошибки переменная errno может принимать
следующее значение:
EINVAL       SIGNUM содержит неправильный номер сигнала.
       Набор сигналов, который заблокирован в данный момент, называется “маской
сигналов”. Каждый процесс имеет свою собственную маску сигналов. При создании
нового процесса, он наследует маску сигналов родительского процесса. Для
модификации маски сигналов используется следующая функция:
       int sigprocmask(int HOW, const sigset_t *SET,
            sigset_t *OLDSET)
       Аргумент HOW определяет каким образом изменяется маска сигналов и может
принимать следующие значения:
SIG_BLOCK          сигналы, задаваемые в наборе, блокируются – добавляются к уже
                   существующей маске сигналов;
SIG_UNBLOCK        сигналы, задаваемые в наборе, разблокируются – удаляются из
                   уже существующей маски сигналов процесса;
SIG_SETMASK        устанавливает набор сигналов для процесса, старое содержимое
                   маски игнорируется.
       Аргумент OLDSET используется для возврата старого содержимого маски
сигналов процесса.
       Функция возвращает 0 в случае успеха и –1 в противном случае. При
возникновении ошибки переменная errno может принимать следующее значение:
EINVAL        SIGNUM содержит неправильный номер сигнала.
       Для проверки того, обработчики каких сигналов активны в настоящий момент
используется следующая функция:
       int sigpending(sigset_t *SET)
        Функция возвращает информацию об активных в текущий момент сигналах.
Если имеется заблокированный сигнал, поступивший процессу, то он также включается
в маску сигналов. Возвращает 0 в случае успешного выполнения и –1 в случае ошибки.
        Пример проверки активных сигналов:

       #include 
       #include 

       sigset_t base_mask, waiting_mask;

       sigemptyset (&base_mask);
       sigaddset (&base_mask, SIGINT);
       sigaddset (&base_mask, SIGTSTP);

       /* Блокировка прерываний пользователя */
       sigprocmask (SIG_SETMASK, &base_mask, NULL);
       ...

       sigpending (&waiting_mask);
       if (sigismember (&waiting_mask, SIGINT)) {
            /* Попытка прекратить выполнение процесса */
       }
       else if (sigismember (&waiting_mask, SIGTSTP)) {
            /* Попытка остановить выполнения процесса */
       }




       28