«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как корректно обрабатывать прерывания Ctrl-C в C++ с помощью функции Sigaction?

Как корректно обрабатывать прерывания Ctrl-C в C++ с помощью функции Sigaction?

Опубликовано 17 ноября 2024 г.
Просматривать:304

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

Перехват событий Ctrl-C в C

Перехват событий Ctrl-C — необходимая задача в программировании, особенно если вы хотите корректно реагировать на неожиданные перерывы.

Использование Sigaction

В C более надежно использовать функцию sigaction для обработки сигналов. Синтаксис следующий:

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

где:

  • signum: to быть обработан Номер сигнала, для Ctrl-C, SIGINT.
  • act: определяет действие нового обработчика сигнала.
  • oldact: сохраняет предыдущее поведение.

В примере, приведенном Томасом, структура sigaction выглядит следующим образом:

struct sigaction sigIntHandler;

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

где:

  • sa_handler: указывает на функцию-обработчик.
  • sa_mask: Маска сигнала, которую следует запретить во время обработки этого сигнала.
  • sa_flags: дополнительные флаги, обычно 0.

Используйте эту структуру sigaction с сигналом SIGINT:

sigaction(SIGINT, &sigIntHandler, NULL);

Функция-обработчик

Наконец, вам нужна функция-обработчик для ответа на сигнал. В этом примере my_handler просто печатает сообщение и выходит из программы:

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

Полный код

Ниже приведен полный код, который использует sigaction для захвата событий 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;    
}

Используя sigaction, вы можете надежно перехватывать события Ctrl-C и предпринимать соответствующие действия.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3