सिग्नल ऑपरेटिंग सिस्टम द्वारा एक प्रोसेस को दिए गए इंटरप्ट हैं जो प्रोग्राम को समय से पहले समाप्त कर सकते हैं। आप UNIX, LINUX, Mac OS X या Windows सिस्टम पर Ctrl+C दबाकर इंटरप्ट उत्पन्न कर सकते हैं।
ऐसे सिग्नल हैं जिन्हें प्रोग्राम द्वारा पकड़ा नहीं जा सकता लेकिन उन सिग्नल की निम्नलिखित सूची है जिन्हें आप अपने प्रोग्राम में पकड़ सकते हैं और सिग्नल के आधार पर उचित कार्रवाई कर सकते हैं। ये सिग्नल C++ हेडर फाइल में परिभाषित हैं
| सिग्नल |
विवरण |
|---|---|
| SIGABRT |
प्रोग्राम का असामान्य समाप्ति, जैसे abort कॉल। |
| SIGFPE |
एक गलत अंकगणितीय ऑपरेशन, जैसे शून्य से विभाजन या ओवरफ्लो का परिणाम देने वाला ऑपरेशन। |
| SIGILL |
एक अवैध निर्देश का पता लगाना। |
| SIGINT |
एक इंटरैक्टिव अटेंशन सिग्नल की प्राप्ति। |
| SIGSEGV |
स्टोरेज तक अवैध पहुंच। |
| SIGTERM |
प्रोग्राम को भेजा गया समाप्ति अनुरोध। |
signal() फंक्शन
C++ सिग्नल-हैंडलिंग लाइब्रेरी अप्रत्याशित घटनाओं को ट्रैप करने के लिए signal फंक्शन प्रदान करती है। signal() फंक्शन का सिंटैक्स निम्नलिखित है -
void (*signal (int sig, void (*func)(int)))(int);
इसे सरल रखते हुए, यह फंक्शन दो आर्गुमेंट प्राप्त करता है: पहला आर्गुमेंट एक इंटीजर जो सिग्नल नंबर का प्रतिनिधित्व करता है और दूसरा आर्गुमेंट सिग्नल-हैंडलिंग फंक्शन का एक पॉइंटर।
आइए एक साधारण C++ प्रोग्राम लिखें जहां हम signal() फंक्शन का उपयोग करके SIGINT सिग्नल को पकड़ेंगे। आप अपने प्रोग्राम में जो भी सिग्नल पकड़ना चाहते हैं, आपको उस सिग्नल को signal फंक्शन का उपयोग करके रजिस्टर करना होगा और इसे एक सिग्नल हैंडलर से जोड़ना होगा। निम्नलिखित उदाहरण की जांच करें -
उदाहरण
#include <iostream> #include <csignal> using namespace std; void signalHandler( int signum ) { cout << "Interrupt signal (" << signum << ") received.\n"; // क्लीनअप और क्लोज अप स्टफ यहां // प्रोग्राम समाप्त करें exit(signum); } int main () { // सिग्नल SIGINT और सिग्नल हैंडलर रजिस्टर करें 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"; // क्लीनअप और क्लोज अप स्टफ यहां // प्रोग्राम समाप्त करें exit(signum); } int main () { int i = 0; // सिग्नल SIGINT और सिग्नल हैंडलर रजिस्टर करें 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.