Функции библиотеки C -sigpending()

sigpendingФункция в стандартной библиотеке C, используемая для получения набора ожидающих сигналов текущего процесса. Ожидающие сигналы — это сигналы, которые были заблокированы, но ещё не обработаны. Эта функция определена в<signal.h>В заголовочном файле.

Синтаксис

int sigpending(sigset_t *set);

Параметр

  • sigset_t *set: указывает наsigset_tПеременная типа, которая будет заполнена набором ожидающих сигналов текущего процесса.

Возвращаемое значение

  • Возвращает 0 при успехе.
  • Возвращает -1 при ошибке и устанавливаетerrnoдля указания типа ошибки.

Пример

Ниже приведён пример использованияsigpendingПример программы для функции, извлекающей набор ожидающих сигналов текущего процесса. Программа блокируетSIGINTсигнал, затем отправляет этот сигнал и используетsigpendingПроверяет, находится ли этот сигнал в наборе ожидающих сигналов.

Пример

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void handle_sigint(int sig) {
    printf("Перехвачен сигнал %d\n", sig);
}

int main() {
    sigset_t new_mask, old_mask, pending;

    // Установить обработчик для SIGINT
    signal(SIGINT, handle_sigint);

    // Инициализировать набор сигналов и заблокировать сигнал SIGINT
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // Отправить сигнал SIGINT
    raise(SIGINT);

    // Получить набор ожидающих сигналов
    if (sigpending(&pending) == -1) {
        perror("sigpending");
        return 1;
    }

    // Проверить, находится ли SIGINT в наборе ожидающих сигналов
    if (sigismember(&pending, SIGINT)) {
        printf("SIGINT ожидает обработки\n");
    } else {
        printf("SIGINT не ожидает обработки\n");
    }

    // Восстановить исходную маску сигналов
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    return 0;
}

После компиляции и запуска программы вывод будет следующим:

SIGINT is pending
Caught signal 2

Программа сначала блокируетSIGINTсигнал, затем отправляет этот сигнал и используетsigpendingПроверяетSIGINTНаходится ли он в наборе ожидающих сигналов. Наконец, программа восстанавливает исходную маску сигналов и перехватываетSIGINTсигнал, выполняет обработчик сигнала.

Разбор

  • sigset_t new_mask, old_mask, pending;: определяет три набора сигналов, используемых для управления маскированием сигналов и хранения набора ожидающих сигналов.
  • ИспользованиеsigprocmaskФункция блокировкиSIGINTСигнал и сохраняет исходную маску сигналов.
  • ИспользованиеraiseФункция отправкиSIGINTсигнал.
  • ИспользованиеsigpendingФункция извлекает набор ожидающих сигналов и проверяетSIGINTнаходится ли он в наборе ожидающих сигналов.
  • ИспользованиеsigprocmaskФункция восстанавливает исходную маску сигналов.

Примечания

  • sigpendingФункция извлекает набор ожидающих сигналов текущего процесса, включая все сигналы, которые были отправлены, но еще не обработаны.
  • Функции обработки сигналов должны быть как можно короче, потому что во время обработки сигнала другие сигналы блокируются. Длительно выполняющиеся функции обработки сигналов могут влиять на производительность программы в реальном времени.

Стандартная библиотека C - <signal.h>

Другие расширения