Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में सिग्नल हैंडलिंग

सिग्नल ऑपरेटिंग सिस्टम द्वारा एक प्रक्रिया को दिए गए व्यवधान हैं जो किसी प्रोग्राम को समय से पहले समाप्त कर सकते हैं। आप UNIX, LINUX, Mac OS X या Windows सिस्टम पर Ctrl+C दबाकर व्यवधान उत्पन्न कर सकते हैं।

ऐसे सिग्नल हैं जिन्हें प्रोग्राम द्वारा पकड़ा नहीं जा सकता है, लेकिन सिग्नल की एक निम्नलिखित सूची है जिसे आप अपने प्रोग्राम में पकड़ सकते हैं और सिग्नल के आधार पर उचित कार्रवाई कर सकते हैं। इन संकेतों को C++ शीर्षलेख फ़ाइल में परिभाषित किया गया है

Signal
<वें शैली ="पाठ-संरेखण:केंद्र;">विवरण
SIGABRT
कार्यक्रम की असामान्य समाप्ति, जैसे निरस्त करने . के लिए कॉल करना .
SIGFPE
एक गलत अंकगणितीय ऑपरेशन, जैसे कि शून्य से भाग देना या एक ऑपरेशन जिसके परिणामस्वरूप अतिप्रवाह होता है।
सिगिल
अवैध निर्देश का पता लगाना।
सिगिनट
एक इंटरैक्टिव ध्यान संकेत की प्राप्ति।
SIGSEGV
भंडारण के लिए एक अमान्य पहुंच।
SIGTERM
कार्यक्रम को समाप्त करने का अनुरोध भेजा गया।

सिग्नल () फंक्शन

सी ++ सिग्नल-हैंडलिंग लाइब्रेरी अप्रत्याशित घटनाओं को फंसाने के लिए फ़ंक्शन सिग्नल प्रदान करती है। सिग्नल () फ़ंक्शन का सिंटैक्स निम्नलिखित है -

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

इसे सरल रखते हुए, इस फ़ंक्शन को दो तर्क प्राप्त होते हैं:पहला तर्क एक पूर्णांक के रूप में जो सिग्नल संख्या का प्रतिनिधित्व करता है और दूसरा तर्क सिग्नल-हैंडलिंग फ़ंक्शन के सूचक के रूप में।

आइए हम एक साधारण सी ++ प्रोग्राम लिखें जहां हम सिग्नल () फ़ंक्शन का उपयोग करके सिगिनट सिग्नल पकड़ लेंगे। आप अपने प्रोग्राम में जो भी सिग्नल पकड़ना चाहते हैं, आपको सिग्नल फ़ंक्शन का उपयोग करके उस सिग्नल को पंजीकृत करना होगा और उसे सिग्नल हैंडलर से जोड़ना होगा। निम्नलिखित उदाहरण की जाँच करें -

उदाहरण

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

उठाना () फंक्शन

आप फ़ंक्शन बढ़ाएँ () द्वारा संकेत उत्पन्न कर सकते हैं, जो एक पूर्णांक संकेत संख्या को एक तर्क के रूप में लेता है और इसमें निम्नलिखित सिंटैक्स होता है।

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++ में एक्सेप्शन हैंडलिंग बेसिक्स

    सी ++ में, अपवाद हैंडलिंग रनटाइम त्रुटियों को संभालने की एक प्रक्रिया है। अपवाद एक घटना है जिसे सी ++ में रनटाइम पर फेंक दिया जाता है। सभी अपवाद std::Exception वर्ग से लिए गए हैं। यह एक रनटाइम त्रुटि है जिसे संभाला जा सकता है। अगर हम अपवाद को हैंडल नहीं करते हैं तो यह अपवाद संदेश को प्रिंट करता है औ

  1. सी ++ में अपवाद हैंडलिंग और ऑब्जेक्ट विनाश

    C ++ में डिस्ट्रक्टर्स को मूल रूप से तब कहा जाता है जब ऑब्जेक्ट नष्ट हो जाएंगे और सिस्टम से मेमोरी जारी करेंगे। जब कक्षा में एक अपवाद फेंका जाता है, तो कैच ब्लॉक निष्पादित होने से पहले विनाशक को स्वचालित रूप से बुलाया जाता है। एल्गोरिदम Begin    Declare a class sample1.      

  1. सी ++ के साथ फाइल हैंडलिंग में टेलप ()

    सी ++ फ़ाइल हैंडलिंग में, टेलप () फ़ंक्शन का उपयोग आउटपुट स्ट्रीम के साथ किया जाता है, और स्ट्रीम में पॉइंटर की वर्तमान पुट स्थिति देता है। यह एक पूर्णांक डेटा प्रकार देता है, जो स्ट्रीम पॉइंटर की वर्तमान स्थिति का प्रतिनिधित्व करता है। tellp() method takes no parameter. It is written as: pos_type t