सिग्नल ऑपरेटिंग सिस्टम द्वारा एक प्रक्रिया को दिए गए व्यवधान हैं जो किसी प्रोग्राम को समय से पहले समाप्त कर सकते हैं। आप 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.