"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar normalmente com interrupções Ctrl-C em C++ com a função Sigaction?

Como lidar normalmente com interrupções Ctrl-C em C++ com a função Sigaction?

Publicado em 17/11/2024
Navegar:793

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

Interceptando eventos Ctrl-C em C

Interceptando eventos Ctrl-C é uma tarefa necessária na programação, especialmente quando você deseja responder graciosamente a interrupções inesperadas.

Usando Sigaction

Em C, é mais confiável usar a função sigaction para lidar com sinais. A sintaxe é a seguinte:

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

where:

  • signum: to ser processado O número do sinal, para Ctrl-C, SIGINT.
  • act: Especifica a ação do novo manipulador de sinal.
  • oldact: Armazena o comportamento anterior.

No exemplo dado por Thomas, a estrutura sigaction é a seguinte:

struct sigaction sigIntHandler;

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

where:

  • sa_handler: aponta para a função do manipulador.
  • sa_mask: A máscara de sinal a ser evitada durante o processamento deste sinal.
  • sa_flags: sinalizadores adicionais, geralmente 0.

Use esta estrutura sigaction com o sinal SIGINT:

sigaction(SIGINT, &sigIntHandler, NULL);

Handler function

Finalmente, você precisa de uma função manipuladora para responder ao sinal. No exemplo, my_handler apenas imprime uma mensagem e sai do programa:

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

Código completo

A seguir está o código completo que usa 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;    
}

Ao usar sigaction você pode capturar eventos Ctrl-C de forma confiável e tomar as medidas apropriadas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3