আমরা প্রয়োজনীয় ফাংশন সম্পর্কে সচেতন যে IO ক্রিয়াকলাপগুলি ফাইলগুলি পড়তে এবং লেখার জন্য খেলতে পারে। যাইহোক, পুরানো IO ক্রিয়াকলাপগুলি প্রোগ্রামটিকে চলতে বাধা দিতে পারে এবং বিলম্ব ঘটাতে পারে। এই সমস্যা সমাধানের জন্য অ-ব্লকিং IO পদ্ধতি ব্যবহার করা যেতে পারে। যেহেতু IO নন-ব্লকিং, তাই IO অপারেশন চলাকালীন একটি প্রোগ্রাম চলতে পারে। "নির্বাচন" ফাংশনটি একটি নন-ব্লকিং IO প্রদানের জন্য সি প্রোগ্রামিং ভাষায় প্রায়শই ব্যবহৃত একটি টুল। "নির্বাচন" ফাংশনের সাহায্যে, এটি সকেট বা ফাইল হ্যান্ডেলের মতো অসংখ্য ফাইল বর্ণনাকারীকে নিরীক্ষণ করতে সাহায্য করে, যাতে পড়া/লেখার প্রস্তুতি বা ত্রুটি। "নির্বাচন" ফাংশনটি আমাদের প্রোগ্রামের নির্বাহে বিলম্ব না করে কার্যকরভাবে বেশ কয়েকটি IO কাজ পরিচালনা করতে দেয়। এটি ক্রমাগত একাধিক IO সংস্থানগুলির স্থিতি পরীক্ষা করার একটি উপায় প্রদান করে৷
চলুন আলোচনা করা যাক কিভাবে সি ল্যাঙ্গুয়েজে "select" ফাংশন দিয়ে নন-ব্লকিং IO প্রয়োগ করা যায়। আমরা "নির্বাচন" এর মৌলিক ব্যবহার সম্পর্কে আলোচনা করব এবং এর প্রয়োগ ব্যাখ্যা করার জন্য একটি প্রোগ্রামিং উদাহরণ প্রদান করব।
"নির্বাচন" ফাংশন কি?
"সিলেক্ট" ফাংশনটি সি ল্যাঙ্গুয়েজের একটি শক্তিশালী টুল যা আমাদের একটি নন-ব্লকিং IO বাস্তবায়ন করতে সাহায্য করে। এই ফাংশনটি আমাদেরকে একাধিক ফাইল বর্ণনাকারীকে নিরীক্ষণ করতে সক্ষম করে, যেমন সকেট বা ফাইল হ্যান্ডেলগুলি পড়তে বা লেখার জন্য প্রস্তুত কিনা তা পরীক্ষা করতে। ফাংশনটি ফাইল বর্ণনাকারীর তিনটি সেট নেয় যা রিড সেট, রাইট সেট এবং ব্যতিক্রম সেট। এই সেটগুলি ব্যবহার করে, আমরা নির্দিষ্ট ক্রিয়াকলাপের জন্য আমরা কোন বর্ণনাকারীকে নিরীক্ষণ করতে চাই তা নির্দিষ্ট করতে পারি। ফাংশনটি একটি টাইমআউট মান নেয় যা আমাদের একটি ইভেন্টের জন্য অপেক্ষা করার জন্য সর্বাধিক সময় নির্দিষ্ট করতে দেয়। যখন কোনো পর্যবেক্ষণ করা বর্ণনাকারীতে কোনো ইভেন্ট ঘটে বা যখন টাইমআউট শেষ হয়ে যায়, তখন "নির্বাচন করুন" ফিরে আসে এবং প্রস্তুত বর্ণনাকারীদের তথ্য প্রদান করে। এইভাবে, আমরা প্রোগ্রাম এক্সিকিউশন ব্লক না করে দক্ষতার সাথে IO অপারেশনগুলি সম্পাদন করতে পারি যা এটি একাধিক IO অপারেশন পরিচালনা করার জন্য উপযুক্ত করে তোলে৷
নন-ব্লকিং IO-এর জন্য "নির্বাচন" ফাংশন বেশ কিছু সুবিধা নিয়ে আসে। এটি আমাদের সংযোগ প্রতি একটি থ্রেডের প্রয়োজন ছাড়াই একাধিক IO ক্রিয়াকলাপগুলির দক্ষ পরিচালনার জন্য অনুমতি দেয় যা সংস্থান খরচ হ্রাস করে৷
যাইহোক, "নির্বাচন" ফাংশনের কিছু অসুবিধা রয়েছে, যেমন সর্বোচ্চ সংখ্যক ফাইল বর্ণনাকারী এটি নিরীক্ষণ করতে পারে, যা প্রায়শই অপারেটিং সিস্টেম দ্বারা সীমাবদ্ধ থাকে। এছাড়াও, ফাইল বর্ণনাকারীর সংখ্যা বাড়ার সাথে সাথে "নির্বাচন" ফাংশনের কর্মক্ষমতা হ্রাস পেতে পারে।
প্রোগ্রামিং উদাহরণ 1:
# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
#include
# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত
#include
#include
int প্রধান ()
{
// ফাইল বর্ণনাকারী নিরীক্ষণ করতে
int fd1, fd2;
// আসুন ফাইল খুলি বা তৈরি করি এবং সেগুলিকে নন-ব্লকিং মোডে সেট করি
fd1 =open ("file1.txt", O_RDONLY | O_NONBLOCK);
fd2 =open ("file2.txt", O_WRONLY | O_NONBLOCK);
fd_set read_fds, write_fds; // ফাইল বর্ণনাকারী সেট
struct সময়কাল সময়সীমা; // নির্বাচনের সময়সীমা
যখন (1)
{
FD_ZERO (&read_fds); // পড়া সেট সাফ করুন
FD_ZERO (&write_fds); // লেখার সেট সাফ করুন
FD_SET(fd1, &read_fds); // পঠিত সেটে fd1 যোগ করুন
FD_SET(fd2, &write_fds); // লেখা সেটে fd2 যোগ করুন
timeout.tv_sec =4; // 4 সেকেন্ডের একটি টাইমআউট সেট করুন
timeout.tv_usec =0;
int ready_fds =নির্বাচন করুন (fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
যদি (ready_fds ==-1) {
ভুল ("নির্বাচন");
প্রস্থান (EXIT_FAILURE);
}
অন্যথায় যদি (ready_fds ==0) {
printf ("টাইমআউট হয়েছে\n");
}
অন্য
{
যদি (FD_ISSET(fd1, &read_fds)) {
// fd1 পড়ার জন্য প্রস্তুত
চার বাফার [100]; // পড়ার জন্য একটি বাফার তৈরি করুন
ssize_t bytesRead =read(fd1, buffer, sizeof (বাফার) - 1);
যদি (বাইট পড়ুন> 0) {
বাফার [বাইট রিড] ='\0'; // স্ট্রিংটি নাল-টার্মিনেট করুন
printf ("file1.txt থেকে পড়ুন:%s \n", বাফার);
}
যদি (FD_ISSET (fd2, &write_fds)) {
// fd2 লেখার জন্য প্রস্তুত
const char* বার্তা ="শুভ সকাল";
ssize_t bytesWritten =লিখুন (fd2, বার্তা, strlen (বার্তা));
যদি (বাইট লিখিত> 0) {
printf ("file2.txt এ লিখেছেন:%s \n", বার্তা);
}
}
}
}
// আসুন ফাইল বর্ণনাকারী বন্ধ করি
বন্ধ (fd1);
বন্ধ (fd2);
রিটার্ন 0;
আউটপুট:
file2.txt এ লিখেছেন:শুভ সকাল
file2.txt এ লিখেছেন:শুভ সকাল
file2.txt এ লিখেছেন:শুভ সকাল
file2.txt এ লিখেছেন:শুভ সকাল
টাইমআউট ঘটেছে
ব্যাখ্যা:
প্রোগ্রামে, আমরা "file1.txt" এবং "file2.txt" দুটি ফাইল নিরীক্ষণ করতে সি ভাষায় "নির্বাচন" সহ নন-ব্লকিং IO প্রয়োগ করি। এটি ফাইলগুলিকে নন-ব্লকিং মোডে সেট করে যার মানে হল যে প্রোগ্রামটি এখন ফাইলগুলি সম্পূর্ণরূপে পড়া বা লেখার জন্য অপেক্ষা না করেই চালানো চালিয়ে যেতে পারে। প্রোগ্রামিং উদাহরণ একটি নির্দিষ্ট সময়সীমার মধ্যে ফাইলগুলিতে কোনো কার্যকলাপ আছে কিনা তা পরীক্ষা করতে "নির্বাচন" ফাংশন ব্যবহার করে। যদি টাইমআউটের সময় কোনও কার্যকলাপ না থাকে তবে এটি শুধুমাত্র "টাইমআউট হয়েছে" প্রিন্ট করে। যদি কার্যকলাপ থাকে, তবে এটি কোন ফাইলের কার্যকলাপ আছে তা পরীক্ষা করে। যদি "file1.txt" এ কার্যকলাপ থাকে, প্রোগ্রামটি ফাইলের বিষয়বস্তু পড়ে এবং সেগুলি প্রিন্ট করে। যদি "file2.txt" এ কার্যকলাপ থাকে, তাহলে এটি ফাইলটিতে একটি "শুভ সকাল" বার্তা প্রিন্ট করে। এটি বন্ধ না হওয়া পর্যন্ত প্রোগ্রামটি অনির্দিষ্টকালের জন্য ফাইলগুলি পর্যবেক্ষণ করতে থাকে। সবশেষে, এটি সিস্টেম রিসোর্স প্রকাশ করতে ফাইল বর্ণনাকারী বন্ধ করে দেয়।
উপসংহার
সি-তে "নির্বাচন" ফাংশনটি নন-ব্লকিং I/O ক্রিয়াকলাপগুলি বাস্তবায়নের জন্য একটি ভাল সমাধান প্রদান করে। একাধিক ফাইল বর্ণনাকারীর নিরীক্ষণের অনুমতি দিয়ে, এটি প্রোগ্রামের সঞ্চালনকে ব্লক না করে একাধিক I/O কার্যের দক্ষ পরিচালনাকে সক্ষম করে। যদিও, নিরীক্ষণ করা যেতে পারে এমন সর্বোচ্চ সংখ্যক ফাইল বর্ণনাকারী এবং বিপুল সংখ্যক বর্ণনাকারীর সাথে সম্ভাব্য কার্যকারিতার সমস্যাগুলির মতো অসুবিধাগুলি বিবেচনা করা গুরুত্বপূর্ণ। এই ত্রুটিগুলি সত্ত্বেও, "সিলেক্ট" ফাংশনটি সি প্রোগ্রামগুলিতে নন-ব্লকিং I/O পরিচালনা করার জন্য একটি ভাল পছন্দ হিসাবে রয়ে গেছে৷
লেখক সম্পর্কে
বামদেব ঘোষ
ওয়্যারলেস নেটওয়ার্কিং ডোমেনে বামদেব ঘোষের হাতে-কলমে অভিজ্ঞতা রয়েছে। তিনি অ্যান্ড্রয়েড, ব্লুটুথ, লিনাক্স কমান্ড এবং পাইথনের জ্ঞানের সাথে ওয়্যারলেস বা ওয়্যার্ড নেটওয়ার্কিং-এ ওয়্যারশার্ক ক্যাপচার বিশ্লেষণে বিশেষজ্ঞ। তার সাইট অনুসরণ করুন:wifisharks.com