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++)
Trả lời
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;
}
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. –
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
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;
}
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.
Đố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 +C và CTRL +BREAK.
Xem here để biết ví dụ.
Ứng dụng bảng điều khiển, ứng dụng cửa sổ hoặc gì? – GManNickG
Hệ điều hành Windows, Linux, v.v. – shf301
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