परिचय

हम फ़ाइलों को पढ़ने और लिखने में IO ऑपरेशन द्वारा निभाई जाने वाली आवश्यक भूमिका से अवगत हैं। हालांकि, पुराने IO ऑपरेशन प्रोग्राम को चलने से रोक सकते हैं और देरी का कारण बन सकते हैं। इस समस्या को हल करने के लिए नॉन-ब्लॉकिंग IO विधियों का उपयोग किया जा सकता है। चूंकि IO नॉन-ब्लॉकिंग है, एक प्रोग्राम IO ऑपरेशन प्रगति पर होने पर भी चलता रह सकता है। "select" फ़ंक्शन C प्रोग्रामिंग भाषा में नॉन-ब्लॉकिंग IO प्रदान करने के लिए एक अक्सर इस्तेमाल किया जाने वाला उपकरण है। "select" फ़ंक्शन के साथ, यह पढ़ने/लिखने की तैयारी या त्रुटियों के लिए कई फ़ाइल डिस्क्रिप्टर, जैसे सॉकेट या फ़ाइल हैंडल, की निगरानी करने में मदद करता है। "select" फ़ंक्शन हमें प्रोग्राम के निष्पादन में देरी किए बिना कई IO कार्यों को प्रभावी ढंग से प्रबंधित करने की अनुमति देता है। यह कई IO संसाधनों की स्थिति को लगातार जांचने का एक तरीका प्रदान करता है।
आइए चर्चा करें कि C भाषा में "select" फ़ंक्शन के साथ नॉन-ब्लॉकिंग IO को कैसे लागू किया जाए। हम "select" के बुनियादी उपयोग पर चर्चा करेंगे और इसके अनुप्रयोग को समझाने के लिए एक प्रोग्रामिंग उदाहरण प्रदान करेंगे।
"Select" फ़ंक्शन क्या है?
"select" फ़ंक्शन C भाषा में एक शक्तिशाली उपकरण है जो हमें नॉन-ब्लॉकिंग IO को लागू करने में मदद करता है। यह फ़ंक्शन हमें कई फ़ाइल डिस्क्रिप्टर, जैसे सॉकेट या फ़ाइल हैंडल, की निगरानी करने में सक्षम बनाता है ताकि यह जांचा जा सके कि वे पढ़ने या लिखने के लिए तैयार हैं या नहीं। फ़ंक्शन फ़ाइल डिस्क्रिप्टर के तीन सेट लेता है जो रीड सेट, राइट सेट, और एक्सेप्शन सेट हैं। इन सेट का उपयोग करके, हम निर्दिष्ट कर सकते हैं कि हम विशिष्ट ऑपरेशन के लिए किन डिस्क्रिप्टर की निगरानी करना चाहते हैं। फ़ंक्शन एक टाइमआउट मान लेता है जो हमें किसी घटना के लिए प्रतीक्षा करने के लिए अधिकतम समय निर्दिष्ट करने की अनुमति देता है। जब निगरानी किए गए किसी भी डिस्क्रिप्टर पर कोई घटना होती है या जब टाइमआउट समाप्त हो जाता है, तो "select" लौटता है और तैयार डिस्क्रिप्टर पर जानकारी प्रदान करता है। इस तरह, हम प्रोग्राम निष्पादन को ब्लॉक किए बिना IO ऑपरेशन को कुशलतापूर्वक निष्पादित कर सकते हैं जो इसे कई IO ऑपरेशन को संभालने के लिए उपयुक्त बनाता है।
नॉन-ब्लॉकिंग IO के लिए "select" फ़ंक्शन कई लाभ लाता है। यह प्रति कनेक्शन एक थ्रेड की आवश्यकता के बिना कई IO ऑपरेशन के कुशल संचालन की अनुमति देता है जो संसाधन खपत को कम करता है।
हालांकि, "select" फ़ंक्शन के कुछ नुकसान हैं, जैसे कि यह जिन फ़ाइल डिस्क्रिप्टर की निगरानी कर सकता है उनकी अधिकतम संख्या, जो अक्सर ऑपरेटिंग सिस्टम द्वारा सीमित होती है। साथ ही, जैसे-जैसे फ़ाइल डिस्क्रिप्टर की संख्या बढ़ती है, "select" फ़ंक्शन का प्रदर्शन कम हो सकता है।
प्रोग्रामिंग उदाहरण 1:
#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> // strlen के लिए <string.h> हेडर शामिल करें
int main() {
// निगरानी के लिए फ़ाइल डिस्क्रिप्टर
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 timeval timeout; // select के लिए टाइमआउट
while (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 = select(fd2 + 1, &read_fds, &write_fds, NULL, &timeout);
if (ready_fds == -1) {
perror("select");
exit(EXIT_FAILURE);
} else if (ready_fds == 0) {
printf("टाइमआउट हुआ\n");
} else {
if (FD_ISSET(fd1, &read_fds)) {
// fd1 पढ़ने के लिए तैयार है
char buffer[100]; // पढ़ने के लिए बफर बनाएं
ssize_t bytesRead = read(fd1, buffer, sizeof(buffer) - 1);
if (bytesRead > 0) {
buffer[bytesRead] = '\0'; // स्ट्रिंग को नल-टर्मिनेट करें
printf("file1.txt से पढ़ा गया: %s \n", buffer);
}
}
if (FD_ISSET(fd2, &write_fds)) {
// fd2 लिखने के लिए तैयार है
const char* message = "Good morning";
ssize_t bytesWritten = write(fd2, message, strlen(message));
if (bytesWritten > 0) {
printf("file2.txt में लिखा गया: %s \n", message);
}
}
}
}
// फ़ाइल डिस्क्रिप्टर बंद करें
close(fd1);
close(fd2);
return 0;
}
आउटपुट
file2.txt में लिखा गया: Good morning
file2.txt में लिखा गया: Good morning
file2.txt में लिखा गया: Good morning
file2.txt में लिखा गया: Good morning
टाइमआउट हुआ
व्याख्या:
प्रोग्राम में, हम C भाषा में "select" के साथ नॉन-ब्लॉकिंग IO को लागू करते हैं ताकि दो फ़ाइलों "file1.txt" और "file2.txt" की निगरानी की जा सके। यह फ़ाइलों को नॉन-ब्लॉकिंग मोड पर सेट करता है जिसका अर्थ है कि प्रोग्राम अब फ़ाइलों के पूरी तरह से पढ़े या लिखे जाने की प्रतीक्षा किए बिना निष्पादन जारी रख सकता है। प्रोग्रामिंग उदाहरण "select" फ़ंक्शन का उपयोग यह जांचने के लिए करता है कि निर्दिष्ट टाइमआउट अवधि के भीतर फ़ाइलों पर कोई गतिविधि है या नहीं। यदि टाइमआउट के दौरान कोई गतिविधि नहीं होती है, तो यह केवल "टाइमआउट हुआ" प्रिंट करता है। यदि गतिविधि होती है, तो यह जांचता है कि किस फ़ाइल में गतिविधि है। यदि "file1.txt" पर गतिविधि है, तो प्रोग्राम फ़ाइल की सामग्री को पढ़ता है और उन्हें प्रिंट करता है। यदि "file2.txt" पर गतिविधि है, तो यह फ़ाइल में "Good morning" संदेश प्रिंट करता है। प्रोग्राम अनिश्चित काल तक फ़ाइलों की निगरानी करना जारी रखता है जब तक कि इसे समाप्त नहीं किया जाता। अंत में, यह सिस्टम संसाधनों को मुक्त करने के लिए फ़ाइल डिस्क्रिप्टर को बंद करता है।
निष्कर्ष
C में "select" फ़ंक्शन नॉन-ब्लॉकिंग I/O ऑपरेशन को लागू करने के लिए एक अच्छा समाधान प्रदान करता है। कई फ़ाइल डिस्क्रिप्टर की निगरानी की अनुमति देकर, यह प्रोग्राम के निष्पादन को ब्लॉक किए बिना कई I/O कार्यों के कुशल संचालन को सक्षम बनाता है। हालांकि, नुकसान पर विचार करना महत्वपूर्ण है जैसे कि निगरानी किए जा सकने वाले फ़ाइल डिस्क्रिप्टर की अधिकतम संख्या और बड़ी संख्या में डिस्क्रिप्टर के साथ संभावित प्रदर्शन समस्याएं। इन कमियों के बावजूद, "select" फ़ंक्शन C प्रोग्राम में नॉन-ब्लॉकिंग I/O को प्रबंधित करने के लिए एक अच्छा विकल्प बना हुआ है।
लेखक के बारे में

बामदेब घोष
बामदेब घोष को वायरलेस नेटवर्किंग डोमेन में व्यावहारिक अनुभव है। वह वायरलेस या वायर्ड नेटवर्किंग पर वायरशार्क कैप्चर विश्लेषण के विशेषज्ञ हैं, साथ ही एंड्रॉइड, ब्लूटूथ, लिनक्स कमांड और पायथन का ज्ञान रखते हैं। उनकी साइट फॉलो करें: wifisharks.com