Funciones de la biblioteca C -sigsuspend()

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

sigsuspendLa función es una función de la biblioteca estándar de C que se utiliza para reemplazar temporalmente la máscara de señales actual y suspender el proceso hasta que se capture una señal. Se usa frecuentemente para implementar la espera atómica de señales, es decir, no se pierde ninguna señal mientras se espera una señal.

Sintaxis

int sigsuspend(const sigset_t *mask);

Parámetros

  • const sigset_t *mask: puntero a la nueva máscara de señales.sigsuspendReemplaza la máscara de señales actual con esta máscara de señales y restaura la máscara de señales original después de capturar una señal.

Valor de retorno

  • sigsuspendLa función siempre devuelve -1 y establece errnoerrnoaEINTREINTR, lo que indica que la función fue interrumpida por una señal.

Ejemplo

Lo siguiente es un ejemplo que usasigsuspendla función sigsuspend() para esperar una señal específica. El programa establece un manejador de señales y luego usasigsuspendsigsuspend() para suspender el proceso hasta que se capture una señal.

Ejemplo

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

volatile sig_atomic_t flag = 0;

// Función de manejo de señales personalizada
void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
    flag = 1;
}

int main() {
    struct sigaction sa;
    sigset_t new_mask, old_mask, wait_mask;

    // Establece el manejador de SIGINT como handle_sigint
    sa.sa_handler = handle_sigint;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    // Inicializa el conjunto de señales
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);

    // Bloquea la señal SIGINT
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // Inicializa el conjunto de señales en espera
    sigemptyset(&wait_mask);

    printf("Waiting for SIGINT...\n");

    // Usa sigsuspend para suspender el proceso y esperar la señal
    while (!flag) {
        if (sigsuspend(&wait_mask) != -1) {
            perror("sigsuspend");
            return 1;
        }
    }

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

    printf("Exiting...\n");

    return 0;
}

Suponiendo que compile y ejecute el programa, la salida será:

Waiting for SIGINT...

Cuando se presiona Ctrl+C (enviandoSIGINTla señal), la salida será:

Caught signal 2
Exiting...

El programa capturóSIGINTla señal SIGINT, ejecutó la función de manejo de señaleshandle_sigint, establecióflagflag a 1, lo que hizo que el bucle principal terminara y el programa saliera.

Explicación

  • sigset_t new_mask, old_mask, wait_mask;: define tres conjuntos de señales para controlar el enmascaramiento de señales.
  • Usasigprocmaskla función sigprocmask para bloquearSIGINTla señal SIGINT, y guarda la máscara de señales original.
  • Usasigsuspendla función sigsuspend para suspender el proceso y esperar la señal.sigsuspendReemplaza temporalmente la máscara de señales actual porwait_masky restaura la máscara de señales original después de capturar una señal.
  • Después de capturar una señal, restaura la máscara de señales original y continúa ejecutando el programa.

Notas

  • sigsuspendA menudo se usa para implementar un mecanismo confiable de espera de señales, evitando que las señales se pierdan durante el bloqueo.
  • La función de manejo de señales debe ser lo más breve posible, ya que durante el manejo de una señal se bloquean otras señales. Una función de manejo de señales que se ejecuta durante mucho tiempo puede afectar la capacidad de tiempo real del programa.

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

Otras extensiones