2016-08-12 3 views
0

У меня есть такой код:Как распечатать завершение этой программы?

int main() 
{ 
    int x=0; 
    std::cout<<"Enter numbers"<<std::endl; 
    while(std::cin>>x) 
    { 
     std::cout<<"Number entered: "<<x<<std::endl; 
    } 
    return 0; 
} 

Когда я нажимаю ctrl+c код получает прекращается. Я хотел бы напечатать что-то вроде «завершена программа, потому что нажата ctrl+c. Я знаю, что обработка исключений - это способ. Но есть ли другая альтернатива? Кстати, я работаю на Linux.

ответ

1

Нет, обработка исключений не имеет к этому никакого отношения.

Вам необходимо установить обработчик сигнала для сигнала SIGINT с использованием sigaction(2). Обратите внимание, что обработка сигналов асинхронна, и большинство классов и функций библиотеки C++ не являются реентерабельными, поэтому ваш обработчик сигналов довольно ограничен, насколько это возможно. Он не может касаться std::cout, он не может многое сделать. Единственное, что можно сделать безопасно, - это использовать системный вызов write, чтобы записать готовое сообщение в стандартный вывод, до завершения с _exit().

Можно использовать Linux-специфических файловых дескрипторов сигнала, чтобы иметь возможность обрабатывать сигналы безопасным способом, что позволяет использовать C++ Library

+0

Еще одна полезная вещь, чтобы сделать в обработчике сигнала установить [атомный флаг] (http://en.cppreference.com/w/c/ atomic/atomic_flag), чтобы код в основном потоке мог делать что-то на основе информации. – rvighne

0

В Linux вы можете поймать SIGINT сигнала (этот сигнал emited при нажатии CTRL + C), немного пример:

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <signal.h> 
/* procedure signal SIGINT */ 
static void sigint_handler (int signo) 
{ 
    printf ("signal SIGINT!\n"); 
    exit (EXIT_SUCCESS); 
} 
int main (void) 
{ 
    if (signal (SIGINT, sigint_handler) == SIG_ERR) 
    { 
     fprintf (stderr, "Error in SIGINT!\n"); 
     exit (EXIT_FAILURE); 
    } 
    for (;;) 
    pause (); 
    return 0; 
} 
Смежные вопросы