2009-10-29 18 views
99

मैं Ctrl + सी सी ++ में ईवेंट कैसे प्राप्त करूं?मैं ctrl-c ईवेंट कैसे पकड़ सकता हूं? (सी ++)

+0

कंसोल एप्लिकेशन, विंडोज़ एप्लिकेशन, या क्या? – GManNickG

+6

कौन सा ओएस विंडोज, लिनक्स, आदि .. – shf301

+1

अच्छा, यह एक क्यूटी ऐप है, लेकिन मैं इसे विकास के दौरान कंसोल से चला रहा हूं। (यह लिनक्स है) – Scott

उत्तर

133

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' स्वयं एक फ़ंक्शन पॉइंटर प्रकार है। –

+23

, आदि - यह सी है, सी ++ नहीं। सी ++ में आपको Abyx

+0

ओएसएक्स पर काम करना चाहिए। मेरी main.mm फ़ाइल में, मुझे सिग्नल.h, stdlib.h, या unistd.h को भी शामिल करने की आवश्यकता नहीं थी। मैंने अभी stdio.h और फाउंडेशन/फाउंडेशन.h शामिल किया है, और फिर अगर मुझे शटडाउन संदेश आउटपुट के लिए std :: cout stuff करने की आवश्यकता है, तो मैंने iostream शामिल किया था। – Volomike

24

आप SIGINT signal (हम POSIX बात कर रहे हैं ना?) Sigaction के लिए

देखें @Gab Royer's जवाब को पकड़ने के लिए की है।

उदाहरण:

#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

हां, यह पॉज़िक्स है। मैं प्रश्न में लिनक्स जोड़ना भूल गया। – Scott

+2

सिग्नल() अलग-अलग व्यवहार करता है, भले ही यह बीएसडी या एसआईएसवी शैली का पालन करता हो। sigaction() बेहतर है। – asveikau

+0

हां वह कोड मेरे लिए काम नहीं करता था। sigaction किया था। – Matt

1

हाँ, यह एक मंच निर्भर प्रश्न है।

यदि आप POSIX पर एक कंसोल प्रोग्राम लिख रहे हैं, सिग्नल एपीआई (# शामिल < सिग्नल एच >) का उपयोग करें।

एक WIN32 जीयूआई अनुप्रयोग में आपको WM_KEYDOWN संदेश को संभालना चाहिए।

41

एक Windows कंसोल अनुप्रयोग के लिए, आप CTRL + सी और CTRL + BREAK संभाल करने SetConsoleCtrlHandler उपयोग करना चाहते हैं।

उदाहरण के लिए here देखें।

संबंधित मुद्दे