ฉันจะจับเหตุการณ์ ctrl-c ได้อย่างไร


134

ฉันจะจับเหตุการณ์Ctrl+ Cใน C ++ ได้อย่างไร


แอปพลิเคชันคอนโซลแอปพลิเคชัน Windows หรืออะไร
GManNickG

7
OS ใด Windows, Linux ฯลฯ
shf301

1
มันเป็นแอป Qt แต่ฉันกำลังเรียกใช้จากคอนโซลระหว่างการพัฒนา (นี่คือ Linux)
Scott

คำตอบ:


175

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

1
ฉันคิดว่า my_handler ควรใช้int sในการโต้แย้ง sig_tเป็นประเภทตัวชี้ฟังก์ชัน
Matthew Marshall

38
<stdlib.h> ฯลฯ - เป็น C ไม่ใช่ C ++ ใน C ++ คุณควรใช้ <cstdlib>
Abyx

8
printf()ไม่ปลอดภัยแบบ async ดังนั้นจึงไม่สามารถใช้ภายในเครื่องจัดการสัญญาณได้
PP

8
ฟังก์ชันเหล่านี้ไม่มีใน Windows
Timmmm

2
จะดีจะมีคำอธิบายบางอย่างเกี่ยวกับและsa_mask sa_flags
qed


40

คุณต้องจับสัญญาณ 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;

}

ใช่มันคือ POSIX ฉันลืมเพิ่มลินุกซ์ในคำถาม
Scott

3
สัญญาณ () ทำงานแตกต่างกันขึ้นอยู่กับว่าเป็นไปตามลักษณะ BSD หรือ SysV sigaction () เป็นที่ต้องการ
asveikau

3
ฉันรู้ว่ามันเก่า แต่มันไม่ได้รวบรวมใน g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0 ฉันต้องเปลี่ยนvoid my_handler(sig_t s)เป็นvoid my_handler(sig_atomic_t s).
jcmonteiro

1

ใช่นี่เป็นคำถามที่ขึ้นอยู่กับแพลตฟอร์ม

หากคุณกำลังเขียนโปรแกรมคอนโซลบน POSIX ให้ใช้สัญญาณ API ( #include <signal.h>)

ในแอปพลิเคชัน WIN32 GUI คุณควรจัดการกับWM_KEYDOWNข้อความ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.