কম্পিউটার

C++ এ সিগন্যাল হ্যান্ডলিং


সিগন্যাল হল অপারেটিং সিস্টেমের দ্বারা একটি প্রক্রিয়ায় বিতরণ করা বাধা যা একটি প্রোগ্রামকে সময়ের আগেই শেষ করতে পারে। আপনি UNIX, LINUX, Mac OS X বা Windows সিস্টেমে Ctrl+C চেপে বাধা তৈরি করতে পারেন।

এমন সংকেত রয়েছে যা প্রোগ্রাম দ্বারা ধরা যায় না তবে নিম্নলিখিত সংকেতগুলির একটি তালিকা রয়েছে যা আপনি আপনার প্রোগ্রামে ধরতে পারেন এবং সিগন্যালের উপর ভিত্তি করে যথাযথ পদক্ষেপ নিতে পারেন। এই সংকেতগুলি C++ হেডার ফাইলে সংজ্ঞায়িত করা হয়েছে

সংকেত
বিবরণ
SIGABRT
প্রোগ্রামের অস্বাভাবিক সমাপ্তি, যেমন গর্ভপাত করার জন্য একটি কল .
SIGFPE
একটি ভুল গাণিতিক ক্রিয়াকলাপ, যেমন শূন্য দ্বারা ভাগ করা বা একটি অপারেশন যার ফলে ওভারফ্লো হয়।
সিজিল
একটি অবৈধ নির্দেশের সনাক্তকরণ।
SIGINT
একটি ইন্টারেক্টিভ মনোযোগ সংকেত প্রাপ্তি।
SIGSEGV
সঞ্চয়স্থানে একটি অবৈধ অ্যাক্সেস।
SIGTERM
প্রোগ্রামে একটি সমাপ্তির অনুরোধ পাঠানো হয়েছে।

সিগন্যাল() ফাংশন

C++ সিগন্যাল-হ্যান্ডলিং লাইব্রেরি অপ্রত্যাশিত ইভেন্ট ফাঁদে ফাংশন সংকেত প্রদান করে। নিচে সিগন্যাল() ফাংশনের সিনট্যাক্স −

void (*signal (int sig, void (*func)(int)))(int);

এটিকে সহজ রেখে, এই ফাংশনটি দুটি আর্গুমেন্ট পায়:প্রথম আর্গুমেন্ট একটি পূর্ণসংখ্যা হিসাবে যা সিগন্যাল সংখ্যা এবং দ্বিতীয় আর্গুমেন্টকে সিগন্যাল-হ্যান্ডলিং ফাংশনের পয়েন্টার হিসাবে উপস্থাপন করে৷

আসুন একটি সাধারণ C++ প্রোগ্রাম লিখি যেখানে আমরা signal() ফাংশন ব্যবহার করে SIGINT সিগন্যাল ধরব। আপনি আপনার প্রোগ্রামে যে সিগন্যাল ধরতে চান না কেন, আপনাকে অবশ্যই সেই সিগন্যালটি সিগন্যাল ফাংশন ব্যবহার করে নিবন্ধন করতে হবে এবং এটিকে একটি সিগন্যাল হ্যান্ডলারের সাথে সংযুক্ত করতে হবে। নিম্নলিখিত উদাহরণ পরীক্ষা করুন −

উদাহরণ

#include <iostream>
#include <csignal>
using namespace std;
void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";
   // cleanup and close up stuff here
   // terminate program
   exit(signum);
}
int main () {
   // register signal SIGINT and signal handler
   signal(SIGINT, signalHandler);
   while(1) {
      cout << "Going to sleep...." << endl;
      sleep(1);
   }
   return 0;
}

আউটপুট

Going to sleep....
Going to sleep....
Going to sleep....

Ctrl + C চাপার পরে, এটি দেখাবে,

আউটপুট

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

দ্যা raise() ফাংশন

আপনি ফাংশন raise() দ্বারা সংকেত তৈরি করতে পারেন, যা একটি পূর্ণসংখ্যা সংকেত সংখ্যাকে একটি আর্গুমেন্ট হিসাবে নেয় এবং নিম্নলিখিত সিনট্যাক্স রয়েছে৷

int raise (signal sig);

এখানে, sig হল যেকোনো সংকেত পাঠানোর জন্য সিগন্যাল নম্বর:SIGINT, SIGABRT, SIGFPE, SIGILL, SIGSEGV, SIGTERM, SIGHUP। নিম্নোক্ত উদাহরণ যেখানে আমরা raise() ফাংশন ব্যবহার করে অভ্যন্তরীণভাবে একটি সংকেত বাড়াই -

উদাহরণ

#include <iostream>
#include <csignal>
using namespace std;
void signalHandler( int signum ) {
   cout << "Interrupt signal (" << signum << ") received.\n";
   // cleanup and close up stuff here
   // terminate program
   exit(signum);
}
int main () {
   int i = 0;
   // register signal SIGINT and signal handler
   signal(SIGINT, signalHandler);
   while(++i) {
      cout << "Going to sleep...." << endl;
      if( i == 3 ) {
         raise( SIGINT);
      }
      sleep(1);
   }
   return 0;
}

আউটপুট

Going to sleep....
Going to sleep....
Going to sleep....
Interrupt signal (2) received.

  1. C++ বনাম জাভাতে ব্যতিক্রম হ্যান্ডলিং

  2. C++ এ ব্যতিক্রম হ্যান্ডলিং বেসিক

  3. C++ এ ব্যতিক্রম হ্যান্ডলিং এবং অবজেক্ট ধ্বংস

  4. tellp() C++ এর সাথে ফাইল পরিচালনায়