"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar con elegancia las interrupciones Ctrl-C en C++ con la función Sigaction?

¿Cómo manejar con elegancia las interrupciones Ctrl-C en C++ con la función Sigaction?

Publicado el 2024-11-17
Navegar:297

How to Gracefully Handle Ctrl-C Interrupts in C   with the Sigaction Function?

Interceptar eventos Ctrl-C en C

Interceptar eventos Ctrl-C es una tarea necesaria en la programación, especialmente cuando se desea responder con elegancia a interrupciones inesperadas.

Uso de Sigaction

En C, es más confiable usar la función sigaction para manejar señales. La sintaxis es la siguiente:

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

donde:

  • signum: a ser procesado El número de la señal, para Ctrl-C, SIGINT.
  • act: especifica la acción del nuevo controlador de señal.
  • oldact: almacena el comportamiento anterior.

En el ejemplo dado por Thomas, la estructura de sigaction es la siguiente:

struct sigaction sigIntHandler;

sigIntHandler.sa_handler = my_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;

donde:

  • sa_handler: apunta a la función del controlador.
  • sa_mask: La máscara de señal que se debe evitar durante el procesamiento de esta señal.
  • sa_flags: indicadores adicionales, normalmente 0.

Utilice esta estructura de sigaction con la señal SIGINT:

sigaction(SIGINT, &sigIntHandler, NULL);

Función de controlador

Finalmente, necesita una función de controlador para responder a la señal. En el ejemplo, my_handler simplemente imprime un mensaje y sale del programa:

void my_handler(int s){
   printf("Caught signal %d\n", s);
   exit(1);
}

Código completo

El siguiente es el código completo que utiliza sigaction para capturar eventos Ctrl-C:

#include 
#include 
#include 
#include 

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}

Al utilizar sigaction, puede detectar de manera confiable eventos Ctrl-C y tomar las medidas adecuadas.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3