সিগন্যাল হলো অপারেটিং সিস্টেম দ্বারা একটি প্রসেসে পাঠানো ইন্টারআপ্ট যা প্রোগ্রামকে অপ্রত্যাশিতভাবে বন্ধ করতে পারে। UNIX, LINUX, Mac OS X বা Windows-এ Ctrl+C চাপলে ইন্টারআপ্ট জেনারেট হয়।
কিছু সিগন্যাল প্রোগ্রামে ক্যাচ করা যায় না, কিন্তু নিচের সিগন্যালগুলো ক্যাচ করে উপযুক্ত നടপতি নেওয়া যায়। এগুলো <csignal> হেডারে সংজ্ঞায়িত।
| Signal | বিবরণ |
|---|---|
| SIGABRT | অস্বাভাবিক প্রোগ্রাম টার্মিনেশন, যেমন abort() কল। |
| SIGFPE | অগণিত অপারেশন, যেমন শূন্য দিয়ে ভাগ বা ওভারফ্লো। |
| SIGILL | অবৈধ ইনস্ট্রাকশন ডিটেকশন। |
| SIGINT | ইন্টারঅ্যাক্টিভ অটেনশন সিগন্যাল (Ctrl+C)। |
| SIGSEGV | অবৈধ মেমরি এক্সেস। |
| SIGTERM | প্রোগ্রামে টার্মিনেশন রিকোয়েস্ট। |
signal() ফাংশন
C++ সিগন্যাল-হ্যান্ডলিং লাইব্রেরি signal() ফাংশন প্রদান করে। এর সিনট্যাক্স:
void (*signal (int sig, void (*func)(int)))(int);
সরল ভাষায়, এই ফাংশন দুটি আর্গুমেন্ট নেয়: প্রথমটি সিগন্যাল নম্বর (ইন্টিজার), দ্বিতীয়টি সিগন্যাল-হ্যান্ডলিং ফাংশনへ পয়েন্টার।
নিচে SIGINT সিগন্যাল ক্যাচ করার একটি উদাহরণ দেওয়া হলো। যে সিগন্যাল ক্যাচ করতে চান, সেটি signal() দিয়ে রেজিস্টার করতে হয় এবং একটি হ্যান্ডলার ফাংশন অ্যাসোসিয়েট করতে হয়।
উদাহরণ
#include <iostream>
#include <csignal>
using namespace std;
void signalHandler(int signum) {
cout << "Interrupt signal (" << signum << ") received.\n";
// cleanup and close up stuff here
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 (int 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;
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.