আমি কীভাবে সিটিআরএল-সি ইভেন্টটি ধরতে পারি?


133

আমি কীভাবে সি ++ এ Ctrl+ Cইভেন্টটি ধরব ?


কনসোল অ্যাপ্লিকেশন, উইন্ডোজ অ্যাপ্লিকেশন, বা কী?
GManNGG

7
কোনটি ওএস উইন্ডোজ, লিনাক্স, ইত্যাদি ..
shf301

1
ঠিক আছে, এটি একটি Qt অ্যাপ্লিকেশন, তবে আমি এটি বিকাশের সময় কনসোল থেকে চালাচ্ছি। (এটি লিনাক্স)
স্কট

উত্তর:


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
আমি মনে করি যে আমার_প্রেমীর int sএটি যুক্তি হিসাবে নেওয়া উচিত । sig_tএটি নিজেই একটি ফাংশন পয়েন্টার টাইপ।
ম্যাথু মার্শাল

38
<stdlib.h>, ইত্যাদি - এটি সি, সি ++ নয়। সি ++ এ আপনার <cstdlib>
অ্যাবিক্স

8
printf()অ্যাসিঙ্ক-সিগন্যাল-নিরাপদ নয়, তাই সংকেত হ্যান্ডলারের অভ্যন্তরে ব্যবহার করা যাবে না।
পিপি

7
এই ফাংশনগুলি উইন্ডোজে উপলব্ধ নয়।
টিম্ম্ম্ম

2
sa_maskএবং সম্পর্কে কিছু ব্যাখ্যা আছে ভাল হবে sa_flags
কিড


40

আপনাকে সিগিন্ট সিগন্যাল ধরতে হবে (আমরা ঠিক পসিক্সের সাথে কথা বলছি?)

ক্লান্তির জন্য @ গ্যাব রয়েরের উত্তর দেখুন।

উদাহরণ:

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

}

হ্যাঁ, এটি পসিক্স। আমি প্রশ্নটিতে লিনাক্স যুক্ত করতে ভুলে গেছি।
স্কট

2
সংকেত () বিএসডি বা সিসভি শৈলীর অনুসরণ করে তা নির্ভর করে আলাদা আচরণ করে। sigication () ভাল।
asveikau

2
আমি জানি এটি পুরানো, তবে এটি g ++ (উবুন্টু 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

হ্যাঁ, এটি একটি প্ল্যাটফর্ম নির্ভর প্রশ্ন।

আপনি যদি পসিক্সে কনসোল প্রোগ্রাম লিখছেন তবে সিগন্যাল এপিআই ( #include <signal.h>) ব্যবহার করুন ।

একটি WIN32 GUI অ্যাপ্লিকেশনটিতে আপনার WM_KEYDOWNবার্তাটি পরিচালনা করা উচিত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.