2016-08-12 21 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

不,異常處理與它無關。

您需要使用sigaction(2)SIGINT信號安裝信號處理程序。請注意,信號處理是異步的,並且大多數C++庫類和函數都是不可重入的,所以您的信號處理程序在它可以執行的操作上相當有限。它不能觸摸std::cout,它不能做太多。關於它唯一可以安全執行的操作是使用write系統調用將標準消息寫入標準輸出,然後終止於_exit()

它可以使用Linux特定的信號文件描述符能夠處理信號以安全的方式,允許使用的C++庫

+0

在一個信號處理程序做的另一有用的東西被設置一個[原子標誌(http://en.cppreference.com/w/c/ atomic/atomic_flag),以便主線程中的代碼可以根據信息做些事情。 – rvighne

0

在linux下你可以捕捉的信號SIGINT(此信號當按下CTRL + C),一個小例子emited:

#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; 
}