
আমরা ফাইল থেকে পড়া এবং লেখার জন্য IO অপারেশনের অপরিহার্য ফাংশন সম্পর্কে জানি। কিন্তু, পুরনো IO অপারেশন প্রোগ্রামকে রান হওয়া থেকে বাধা দিতে পারে এবং বিলম্ব সৃষ্টি করতে পারে। নন-ব্লকিং IO মেথড ব্যবহার করে এই সমস্যা সমাধান করা যায়। IO নন-ব্লকিং হওয়ায়, একটি প্রোগ্রাম চলতে থাকতে পারে যখন IO অপারেশন প্রগতিতে থাকে। "select" ফাংশন সি প্রোগ্রামিং ভাষায় নন-ব্লকিং IO প্রদান করার জন্য একটি প্রয়োজ্য টুল। "select" ফাংশন দিয়ে, অনেক ফাইল ডেসক্রিপ্টর, যেমন সকেট বা ফাইল হ্যান্ডেল, পড়া/লেখার জন্য রেডিনেস বা এরর মনিটর করা যায়। "select" ফাংশন আমাদের প্রোগ্রাম এক্সিকিউশন বাধা দিয়ে না কার্যকরভাবে একাধিক IO টাস্ক ম্যানেজ করতে দেয়। এটি একাধিক IO রিসোর্সের স্ট্যাটাস συνεχে চেক করার একটি উপায় প্রদান করে।
আমরা আলোচনা করব কীভাবে সি ভাষায় "select" ফাংশন ব্যবহার করে নন-ব্লকিং IO বাস্তবায়ন করতে হয়। আমরা "select"-এর বেসিক ব্যবহার নিয়ে আলোচনা করব এবং এর অ্যাপ্লিকেশন ব্যাখ্যা করার জন্য একটি প্রোগ্রামিং উদাহরণ দেব।
"Select" ফাংশন কী?
"select" ফাংশন সি ভাষায় একটি শক্তিশালী টুল যা নন-ব্লকিং IO বাস্তবায়ন করতে সাহায্য করে। এই ফাংশন আমাদের একাধিক ফাইল ডেসক্রিপ্টর, যেমন সকেট বা ফাইল হ্যান্ডেল, মনিটর করতে সক্ষম করে যাতে চেক করা যায় সেগুলো পড়া বা লেখার জন্য রেডি কিনা। ফাংশনটি তিনটি সেট ফাইল ডেসক্রিপ্টর নেয় যেগুলো হলো রিড সেট, রাইট সেট, এবং এক্সেপশন সেট। এই সেটগুলো ব্যবহার করে, আমরা স্পেসিফাই করতে পারি কোন ডেসক্রিপ্টরগুলো আমরা নির্দিষ্ট অপারেশনের জন্য মনিটর করতে চাই। ফাংশনটি একটি টাইমআউট ভ্যালু নেয় যা আমাদের একটি ইভেন্টের জন্য সর্বোচ্চ কতক্ষণ অপেক্ষা করবে তা স্পেসিফাই করতে দেয়। যখন মনিটর করা ডেসক্রিপ্টরের যেকোনো একটিয় ইভেন্ট ঘটে বা টাইমআউট এক্সপায়ার হয়, "select" রিটার্ন করে এবং রেডি ডেসক্রিপ্টর সম্পর্কে তথ্য প্রদান করে। এইভাবে, আমরা প্রোগ্রাম এক্সিকিউশন ব্লক না করে দক্ষতার সাথে IO অপারেশন সম্পাদন করতে পারি যা একাধিক IO অপারেশন হ্যান্ডেল করার জন্য উপযুক্ত।
নন-ব্লকিং IO-র জন্য "select" ফাংশন বেশ কিছু সুবিধা আনে। এটি একাধিক IO অপারেশন দক্ষতার সাথে হ্যান্ডেল করতে দেয় প্রতি কানেকশনের জন্য একটি থ্রেডের প্রয়োজন ছাড়া যা রিসোর্স কনসাম্পশন কমায়।
তবে, "select" ফাংশনের কিছু ডিসঅ্যাডভান্টেজও রয়েছে, যেমন এটি যে সর্বোচ্চ সংখ্যক ফাইল ডেসক্রিপ্টর মনিটর করতে পারে, যা প্রায়শই অপারেটিং সিস্টেম দ্বারা সীমাবদ্ধ। এছাড়া, ফাইল ডেসক্রিপ্টরের সংখ্যা বৃদ্ধি পাওয়ার সাথে সাথে, "select" ফাংশনের পারফরম্যান্স কমতে পারে।
প্রোগ্রামিং উদাহরণ ১:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h> // Include the <string.h> header for strlen
int main ()
{
// File descriptors to monitor
int fd1, fd2;
// Let us Open or create files and set them to non-blocking mode
fd1 = open ("file1.txt", O_RDONLY | O_NONBLOCK);
fd2 = open ("file2.txt", O_WRONLY | O_NONBLOCK);
fd_set read_fds, write_fds; // File descriptor sets
struct timeval timeout; // Timeout for select
while (1)
{
FD_ZERO (&read_fds); // Clear the read set
FD_ZERO (&write_fds); // Clear the write set
FD_SET(fd1, &read_fds); // Add fd1 to the read set
FD_SET(fd2, &write_fds); // Add fd2 to the write set
timeout.tv_sec = 4; // Set a timeout of 4 seconds
timeout.tv_usec = 0;
int ready_fds = select (fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
if (ready_fds == -1) {
perror("select");
exit (EXIT_FAILURE);
}
else if (ready_fds == 0) {
printf ("Timeout occurred\n");
}
else
{
if (FD_ISSET(fd1, &read_fds)) {
// fd1 is ready for reading
char buffer [100]; // Create a buffer to read into
ssize_t bytesRead = read(fd1, buffer, sizeof (buffer) - 1);
if (bytesRead > 0) {
buffer [bytesRead] = '\0'; // Null-terminate the string
printf ("Read from file1.txt: %s \n", buffer);
}
}
if (FD_ISSET (fd2, &write_fds)) {
// fd2 is ready for writing
const char* message = "Good morning";
ssize_t bytesWritten = write (fd2, message, strlen (message));
if (bytesWritten > 0) {
printf ("Wrote to file2.txt: %s \n", message);
}
}
}
}
// Let us close the File descriptors
close (fd1);
close (fd2);
return 0;
}
আউটপুট:
Wrote to file2.txt: Good morning
Wrote to file2.txt: Good morning
Wrote to file2.txt: Good morning
Wrote to file2.txt: Good morning
Timeout occurred
ব্যাখ্যা:
প্রোগ্রামে, আমরা সি ভাষায় "select" দিয়ে নন-ব্লকিং IO বাস্তবায়ন করি দুটি ফাইল মনিটর করার জন্য যেগুলো হলো "file1.txt" এবং "file2.txt"। এটি ফাইলগুলোকে নন-ব্লকিং মোডে সেট করে যার মানে প্রোগ্রাম এখন ফাইলগুলো সম্পূর্ণ পড়া বা লেখা হওয়ার জন্য অপেক্ষা না করে এক্সিকিউট হতে থাকতে পারে। প্রোগ্রামিং উদাহরণটি "select" ফাংশন ব্যবহার করে চেক করে নির্দিষ্ট টাইমআউট পিরিয়ডের মধ্যে ফাইলগুলোর ওপর কোনো এক্টিভিটি আছে কিনা। যদি টাইমআউটের aikana কোনো এক্টিভিটি না থাকে, তবে এটি শুধু "Timeout occurred" প্রিন্ট করে। যদি এক্টিভিটি থাকে, তবে এটি চেক করে কোন ফাইলে এক্টিভিটি আছে। যদি "file1.txt"-এ এক্টিভিটি থাকে, প্রোগ্রাম ফাইলের কন্টেন্ট পড়ে এবং প্রিন্ট করে। যদি "file2.txt"-এ এক্টিভিটি থাকে, তবে এটি ফাইলে "Good morning" মেসেজ লেখে। প্রোগ্রাম 무기ণফিনিটلی ফাইলগুলো মনিটর করে চলতে থাকে যতক্ষণ না এটি টার্মিনেট হয়। শেষে, এটি ফাইল ডেসক্রিপ্টর বন্ধ করে সিস্টেম রিসোর্স রিলিজ করে।
উপসংহার
সি-তে "select" ফাংশন নন-ব্লকিং I/O অপারেশন বাস্তবায়ন করার জন্য একটি ভালো সমাধান প্রদান করে। একাধিক ফাইল ডেসক্রিপ্টর মনিটর করার অনুমতি দিয়ে, এটি প্রোগ্রাম এক্সিকিউশন ব্লক না করে একাধিক I/O টাস্ক দক্ষতার সাথে হ্যান্ডেল করতে সক্ষম করে। যদিও, ডিসঅ্যাডভান্টেজগুলো বিবেচনা করা গুরুত্বপূর্ণ যেমন মনিটর করা যাবে সর্বোচ্চ ফাইল ডেসক্রিপ্টরের সংখ্যা এবং বড় সংখ্যক ডেসক্রিপ্টর থাকলে পারফরম্যান্স ইস্যু। এই ত্রুটিগুলো থাকা সত্ত্বেও, "select" ফাংশন সি প্রোগ্রামে নন-ব্লকিং I/O ম্যানেজ করার জন্য একটি ভালো পছন্দ।
লেখক সম্পর্কে

বামদেব ঘোষ
বামদেব ঘোষের ওয়ায়ারলেস নেটওয়ার্কিং ডোমেইনে হ্যান্ডস-অন অভিজ্ঞতা রয়েছে। তিনি ওয়ার্লেস বা ওয়ায়ার্ড নেটওয়ার্কিং-এ Wireshark ক্যাপচার অ্যানালাইসিসে এক্সপার্ট, পাশাপাশি অ্যান্ড্রয়েড, ব্লুটুথ, লিনাক্স কমান্ড এবং পাইথনের জ্ঞান রয়েছে। তার সাইট ফলো করুন: wifisharks.com