Funciones de la biblioteca C -sigpending()

sigpendingEs una función de la biblioteca estándar de C utilizada para obtener el conjunto de señales pendientes del proceso actual. Las señales pendientes son señales que se han enviado pero aún no se han procesado después de ser bloqueadas. Esta función se define en<signal.h>el archivo de cabecera.

Sintaxis

int sigpending(sigset_t *set);

Parámetros

  • sigset_t *setapunta a unsigset_tvariable de tipo, que se rellenará con el conjunto de señales pendientes del proceso actual.

Valor de retorno

  • Devuelve 0 en caso de éxito.
  • Devuelve -1 en caso de error y estableceerrnopara indicar el tipo de error.

Ejemplo

A continuación se muestra un uso de lasigpendingfunción para obtener el conjunto de señales pendientes del proceso actual. El programa bloqueaSIGINTseñal, luego envía esa señal y usasigpendingpara verificar si la señal está en el conjunto de señales pendientes.

Ejemplo

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

void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
}

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

    // Configurar el manejador de SIGINT
    signal(SIGINT, handle_sigint);

    // Inicializar el conjunto de señales y bloquear la señal SIGINT
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // Enviar la señal SIGINT
    raise(SIGINT);

    // Obtener el conjunto de señales pendientes
    if (sigpending(&pending) == -1) {
        perror("sigpending");
        return 1;
    }

    // Verificar si SIGINT está en el conjunto de señales pendientes
    if (sigismember(&pending, SIGINT)) {
        printf("SIGINT is pending\n");
    } else {
        printf("SIGINT is not pending\n");
    }

    // Restaurar la máscara de señales original
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    return 0;
}

Después de compilar y ejecutar el programa, la salida será:

SIGINT is pending
Caught signal 2

El programa primero bloqueaSIGINTla señal, luego envía esa señal y usasigpendingpara verificarSIGINTsi está en el conjunto de señales pendientes. Finalmente, el programa restaura la máscara de señales original y captura laSIGINTseñal, ejecuta el manejador de señales.

Análisis

  • sigset_t new_mask, old_mask, pending;: Define tres conjuntos de señales para controlar el enmascaramiento de señales y almacenar el conjunto de señales pendientes.
  • Usasigprocmaskla función para bloquearSIGINTla señal y guarda la máscara de señales original.
  • Usaraisela función para enviarSIGINTla señal.
  • Usasigpendingla función para obtener el conjunto de señales pendientes y verificaSIGINTsi está en el conjunto de señales pendientes.
  • Usasigprocmaskla función para restaurar la máscara de señales original.

Notas

  • sigpendingLa función obtiene el conjunto de señales pendientes del proceso actual, incluidas todas las señales que se han enviado pero aún no se han procesado.
  • La función de manejo de señales debe ser lo más breve posible, ya que se bloquean otras señales durante el procesamiento de una señal. Una función de manejo de señales de larga duración puede afectar el tiempo real del programa.

C 标准库 - <signal.h>Biblioteca estándar de C - <signal.h>

Otras extensiones