Signal Handling হল একটি প্রক্রিয়া যা প্রক্রিয়াকে সংকেত (signals) প্রাপ্ত হলে প্রতিক্রিয়া জানাতে সক্ষম করে। সংকেতগুলি হলো কিছু বিশেষ ঘটনার প্রতিনিধিত্ব, যেমন ব্যবহারকারী দ্বারা পাঠানো সিগন্যাল (যেমন Ctrl+C), বা সিস্টেমের অন্য ঘটনার কারণে সৃষ্টি হওয়া সংকেত। সংকেতগুলি প্রক্রিয়াগুলির মধ্যে যোগাযোগের একটি গুরুত্বপূর্ণ পদ্ধতি।
Signal Handling এর মৌলিক ধারণা
১. সংকেত (Signal):
- সংকেতগুলি হল সিস্টেম দ্বারা একটি প্রক্রিয়ায় পৌঁছানো একটি সংকেত, যা নির্দেশ করে যে একটি নির্দিষ্ট ঘটনা ঘটেছে। উদাহরণস্বরূপ:
SIGINT: সাধারণত ব্যবহারকারী Ctrl+C চাপলে উৎপন্ন হয়।SIGTERM: একটি প্রক্রিয়াকে স্বাভাবিকভাবে বন্ধ করার সংকেত।SIGKILL: একটি প্রক্রিয়া মারার জন্য ব্যবহৃত হয় (এটি হ্যান্ডল করা যায় না)।
২. সংকেত হ্যান্ডলিং:
- সংকেত হ্যান্ডলিং হল একটি প্রক্রিয়া যা সংকেত পাওয়ার পর প্রক্রিয়ার আচরণ পরিবর্তন করতে ব্যবহৃত হয়। এটি একটি ফাংশন দ্বারা করা হয়, যা সংকেত প্রাপ্ত হলে কল করা হয়।
৩. ডিফল্ট আচরণ:
- প্রতিটি সংকেতের একটি ডিফল্ট আচরণ থাকে। ব্যবহারকারী তাদের প্রয়োজন অনুযায়ী এই আচরণ পরিবর্তন করতে পারেন।
signal() ফাংশন
signal() ফাংশনটি একটি সংকেতের জন্য একটি হ্যান্ডলার সেট করে, যা সংকেতটি প্রাপ্ত হলে কার্যকরী হয়।
সাইনাটর:
void (*signal(int sig, void (*handler)(int)))(int);
- sig: সংকেতের নম্বর (যেমন
SIGINT,SIGTERM, ইত্যাদি)। - handler: সংকেতটি প্রাপ্ত হলে কল করা হবে এমন একটি ফাংশনের পয়েন্টার।
উদাহরণ:
নিচে একটি সাধারণ সংকেত হ্যান্ডলিংয়ের উদাহরণ দেওয়া হল যা SIGINT সংকেতকে হ্যান্ডল করে:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
// সংকেত হ্যান্ডলার
void signal_handler(int signum) {
printf("Received signal %d\n", signum);
exit(0); // প্রক্রিয়া বন্ধ করা
}
int main() {
// SIGINT সংকেতের জন্য হ্যান্ডলার সেট করা
signal(SIGINT, signal_handler);
// একটি ইনফাইনাইট লুপ
while (1) {
printf("Running... Press Ctrl+C to stop.\n");
sleep(1); // 1 সেকেন্ড অপেক্ষা করা
}
return 0;
}
উদাহরণ বিশ্লেষণ
১. সংকেত হ্যান্ডলার: signal_handler() ফাংশনটি সংকেত পাওয়ার পর কল করা হয়। এটি প্রাপ্ত সংকেতের নম্বর প্রদর্শন করে এবং প্রক্রিয়াটি বন্ধ করে।
২. সংকেত সেট করা: signal(SIGINT, signal_handler); এই লাইনটি SIGINT সংকেত (যা Ctrl+C দ্বারা তৈরি হয়) পাওয়ার সময় signal_handler ফাংশনকে কল করার জন্য সেট করে।
৩. লুপ: while (1) লুপটি চলতে থাকে এবং প্রতি সেকেন্ডে একটি বার্তা মুদ্রণ করে। যখন ব্যবহারকারী Ctrl+C চাপবে, তখন signal_handler কল হবে।
অন্যান্য সংকেত হ্যান্ডলিং ফাংশন
sigaction(): এটি signal() ফাংশনের তুলনায় আরও উন্নত এবং সূক্ষ্ম নিয়ন্ত্রণ প্রদান করে। এটি সংকেতের জন্য একাধিক সেটিংস এবং আচরণ পরিচালনা করতে সক্ষম।
kill(): একটি সংকেত প্রক্রিয়াতে পাঠানোর জন্য ব্যবহৃত হয়।
উপসংহার
Signal Handling এবং signal() ফাংশনগুলি UNIX/Linux প্রোগ্রামিংয়ে একটি গুরুত্বপূর্ণ অংশ। এটি প্রক্রিয়াগুলির মধ্যে সংকেত প্রেরণ এবং সংকেতের প্রতি প্রতিক্রিয়া জানানোর প্রক্রিয়াকে সহজতর করে। সংকেত হ্যান্ডলিং ব্যবহার করে ডেভেলপাররা তাদের অ্যাপ্লিকেশনের আচরণ নিয়ন্ত্রণ করতে পারেন, যা কার্যকারিতা এবং ইউজার অভিজ্ঞতা উন্নত করে।
Read more