ฉันจะจับเหตุการณ์Ctrl+ Cใน C ++ ได้อย่างไร
คำตอบ:
signal
ไม่ใช่วิธีที่น่าเชื่อถือที่สุดเนื่องจากมีความแตกต่างในการนำไปใช้งาน sigaction
ฉันจะแนะนำให้ใช้ ตอนนี้รหัสของทอมจะมีลักษณะดังนี้:
#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;
}
int s
ในการโต้แย้ง sig_t
เป็นประเภทตัวชี้ฟังก์ชัน
printf()
ไม่ปลอดภัยแบบ async ดังนั้นจึงไม่สามารถใช้ภายในเครื่องจัดการสัญญาณได้
sa_mask
sa_flags
สำหรับคอนโซลแอป Windows คุณต้องการใช้SetConsoleCtrlHandlerจะจับCTRL+ Cและ+CTRLBREAK
ดูที่นี่สำหรับตัวอย่าง
คุณต้องจับสัญญาณ SIGINT (เรากำลังพูดถึง POSIX ใช่ไหม)
ดูคำตอบของ @Gab Royer สำหรับ sigaction
ตัวอย่าง:
#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;
}
void my_handler(sig_t s)
เป็นvoid my_handler(sig_atomic_t s)
.
ใช่นี่เป็นคำถามที่ขึ้นอยู่กับแพลตฟอร์ม
หากคุณกำลังเขียนโปรแกรมคอนโซลบน POSIX ให้ใช้สัญญาณ API ( #include <signal.h>
)
ในแอปพลิเคชัน WIN32 GUI คุณควรจัดการกับWM_KEYDOWN
ข้อความ