मैं ctrl-c ईवेंट कैसे पकड़ सकता हूं?


133

मैं C ++ में Ctrl+ Cघटना कैसे पकड़ सकता हूं ?


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

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

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

जवाबों:


172

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अपने आप में एक फ़ंक्शन पॉइंटर प्रकार है।
मैथ्यू मार्शल

38
<stdlib.h>, आदि - यह C है, C ++ नहीं। C ++ में आपको
बजे

8
printf()async-signal-safe नहीं है, इसलिए सिग्नल हैंडलर के अंदर उपयोग नहीं किया जा सकता है।
पीपी

7
ये कार्य विंडोज पर उपलब्ध नहीं हैं।
टिम्मम

2
के बारे में कुछ स्पष्टीकरण है sa_maskऔर अच्छा होगा sa_flags
QED


40

आपको SIGINT सिग्नल पकड़ना होगा (हम POSIX सही बात कर रहे हैं?)

देखिए @ गाब रॉयरे की जवाबदारी के लिए।

उदाहरण:

#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 है। मैं प्रश्न में लिनक्स जोड़ना भूल गया।
स्कॉट

2
संकेत () अलग तरह से व्यवहार करता है, अगर यह BSD या SysV शैली का अनुसरण करता है। सिगनेशन () बेहतर है।
अस्विकौ

2
मुझे पता है कि यह पुराना है, लेकिन यह 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)
20

1

हाँ, यह एक प्लेटफ़ॉर्म आश्रित प्रश्न है।

यदि आप POSIX पर कंसोल प्रोग्राम लिख रहे हैं, तो सिग्नल API ( #include <signal.h>) का उपयोग करें ।

एक Win32 GUI एप्लिकेशन में आपको WM_KEYDOWNसंदेश को संभालना चाहिए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.