2009-10-29 32 views
99

Làm cách nào để bắt được một số Ctrl + C sự kiện trong C++?Làm cách nào để nhận sự kiện ctrl-c? (C++)

+0

Ứng dụng bảng điều khiển, ứng dụng cửa sổ hoặc gì? – GManNickG

+6

Hệ điều hành Windows, Linux, v.v. – shf301

+1

Vâng, đó là ứng dụng Qt, nhưng tôi đang chạy nó từ bảng điều khiển trong khi phát triển. (Đây là Linux) – Scott

Trả lời

133

signal không phải là cách đáng tin cậy nhất vì nó khác ở chỗ triển khai. Tôi khuyên bạn nên sử dụng sigaction. Mã của Tom giờ sẽ giống như sau:

#include <signal.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

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;  
} 
+1

Tôi nghĩ my_handler nên dùng 'int s' làm đối số của nó. 'sig_t' là một kiểu con trỏ hàm. –

+23

, v.v. - đó là C, không phải C++. Trong C++, bạn nên sử dụng Abyx

+0

Hoạt động trên OSX. Trong tệp main.mm của tôi, tôi thậm chí không cần bao gồm signal.h, stdlib.h hoặc unistd.h. Tôi chỉ bao gồm stdio.h và Foundation/Foundation.h, và sau đó nếu tôi cần phải làm std :: cout stuff để xuất một thông điệp tắt máy, tôi đã đưa iostream. – Volomike

24

Bạn cần phải nắm bắt những SIGINT signal (chúng ta đang nói POSIX phải không?)

Xem @Gab Royer's câu trả lời cho sigaction.

Ví dụ:

#include <signal.h> 
#include <stdlib.h> 
#include <stdio.h> 

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

} 

int main(int argc,char** argv) 
{ 
    signal (SIGINT,my_handler); 

    while(1); 
    return 0; 

} 
+0

Vâng, đó là POSIX. Tôi quên thêm Linux vào câu hỏi. Tín hiệu – Scott

+2

() hoạt động khác nhau, tùy thuộc vào nó có theo kiểu BSD hoặc SysV hay không. sigaction() là thích hợp hơn. – asveikau

+0

Có mã đó không hoạt động đối với tôi. sigaction đã làm. – Matt

1

Vâng, đây là câu hỏi phụ thuộc nền tảng.

Nếu bạn đang viết chương trình bảng điều khiển trên POSIX, sử dụng API tín hiệu (#include <signal.h>).

Trong ứng dụng WIN32 GUI, bạn nên xử lý tin nhắn WM_KEYDOWN.

41

Đối với một giao diện điều khiển ứng dụng Windows, bạn muốn sử dụng để xử lý SetConsoleCtrlHandlerCTRL +CCTRL +BREAK.

Xem here để biết ví dụ.

Các vấn đề liên quan