Funciones de la biblioteca C -sigaction()

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

sigactionLa función es una función de la biblioteca estándar de C, utilizada para comprobar o modificar la acción de manejo asociada con una señal específica. En comparación consignalen comparación con la función,sigactionofrece más control y mejor portabilidad.

Sintaxis

int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);

Parámetros

  • int sig: El número de señal a comprobar o modificar. Las señales comunes incluyenSIGINT、SIGTERM、SIGKILLetc.
  • const struct sigaction *act: Un puntero a la nueva acción de manejo de señal. Si esNULL, no se modifica la acción de manejo de señal actual.
  • struct sigaction *oldact: Un puntero utilizado para guardar la acción de manejo de señal anterior. Si esNULL, no se guarda la acción de manejo de señal anterior.

struct sigactionEstructura

struct sigaction {
    void (*sa_handler)(int);           // 信号处理函数指针
    void (*sa_sigaction)(int, siginfo_t *, void *); // 信号处理函数指针(扩展)
    sigset_t sa_mask;                  // 在处理该信号时要阻塞的信号集
    int sa_flags;                      // 修改信号行为的选项
    void (*sa_restorer)(void);         // 恢复函数,已废弃
};

sa_flagsOpciones comunes de

  • SA_RESTART: Hace que las llamadas al sistema interrumpidas por la señal se reinicien automáticamente.
  • SA_SIGINFO: Usasa_sigactionen lugar desa_handlercomo función de manejo de señal.
  • SA_NOCLDSTOP: SisigSíSIGCHLD, la señal no se genera cuando un proceso hijo se detiene o continúa.

Valor de retorno

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

Ejemplo

El siguiente es un programa de ejemplo simple que demuestra cómo usarsigactionla función para configurarSIGINTel manejador de la señal:

Ejemplo

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

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

int main() {
    struct sigaction sa;

    // Establecer el manejador como handle_sigint
    sa.sa_handler = handle_sigint;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    // Usar sigaction para configurar la nueva acción de manejo de señal
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    // Bucle principal, se ejecuta continuamente hasta capturar una señal
    while (1) {
        printf("Running...\n");
        sleep(1);
    }

    return 0;
}

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

Running...
Running...
Running...
...

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

Caught signal 2

El programa capturó laSIGINTseñal y ejecutó la función personalizada de manejo de señalhandle_sigint, y luego continúa ejecutando el bucle principal.

Consideraciones

  • sigactionLa función ofrece una funcionalidad más rica quesignalla función, permitiendo configurar la función de manejo de señal, la máscara de señal y las opciones de manejo de señal.
  • La función de manejo de señal debe ser lo más breve posible, ya que otras señales se bloquean durante el manejo de la señal. Si la función de manejo de señal tarda demasiado, puede afectar el rendimiento en tiempo real del programa.
  • Ciertas señales (comoSIGKILLySIGSTOP) no pueden ser capturadas ni ignoradas.

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

Otras extensiones