प्राप्त करें मैं अपने सी प्रोग्राम में व्यवहार को कार्यान्वित करना चाहता हूं ताकि यदि एक सिगिनट होता है, तो मैं सभी खुली फ़ाइल डिस्क्रिप्टर बंद करता हूं। क्या उनकी सूची पाने का कोई आसान तरीका है?सी सभी खुली फ़ाइल डिस्क्रिप्टर
उत्तर
मैं ब्रूट फोर्स का उपयोग करता हूं: for (i = 0; i < fd_max; ++i) close (i);
। त्वरित और सुंदर पोर्टेबल।
अपने सभी खुले फ़ाइल डिस्क्रिप्टरों का ट्रैक रखें और उन्हें अलग-अलग बंद करें।
सामान्य स्थिति में, आपके द्वारा उपयोग की जाने वाली लाइब्रेरी में एक खुली फ़ाइल हो सकती है, और इसे बंद करने से वह लाइब्रेरी गलत व्यवहार कर सकती है।
वास्तव में, वही समस्या आपके कोड में मौजूद हो सकती है, क्योंकि यदि आप फ़ाइल डिस्क्रिप्टर को अंधाधुंध रूप से बंद करते हैं लेकिन आपके प्रोग्राम का एक और हिस्सा अभी भी फाइल डिस्क्रिप्टर को याद करता है और इसका उपयोग करने का प्रयास करता है, तो उसे एक अनपेक्षित त्रुटि मिलेगी या (यदि अन्य फाइलें तब से खोली गई हैं) गलत फ़ाइल पर काम करती है। फ़ाइल खोलने के लिए ज़िम्मेदार घटक के लिए यह बहुत बेहतर है, इसे बंद करने के लिए जिम्मेदार भी है।
यदि आप उपलब्ध हैं, तो आप /proc/<pid>/fd.
की सामग्री को पढ़ सकते हैं।
लेकिन संभावित दौड़ के बारे में जागरूक रहें, जो तब हो सकता है जब आपका एप्लिकेशन कुछ पढ़ता है या आपके पढ़ने के बीच /proc/<pid>/fd
के बीच नए खुलता है और आप जो पढ़ते हैं उसे बंद करने जा रहे हैं।
तो मुझे लगता है कि मैं केविन रीड के दृष्टिकोण की सिफारिश करना चाहता हूं।
आप क्यों मानते हैं, '/ proc' उपलब्ध है? यह अस्तित्व में सबसे अयोग्य दुःस्वप्न के बारे में है। – Jens
आप सही हैं। मैंने अपनी टिप्पणी को केवल कुछ सिस्टम के लिए उपयुक्त होने के लिए संशोधित किया। @ जेन्स – alk
यदि पोर्टेबिलिटी के बारे में चिंतित है, तो आप '/ dev/fd /' पढ़ सकते हैं। यह '/ proc/self/fd' से अधिक पोर्टेबल है। –
POSIX सिस्टम के लिए मेरे समाधान:
सभी खोला fd के न्यूनतम मूल्य संभव हो रहे हैं।
open(2)
पर एक रैपर फ़ंक्शन बनाएं।
आपका नया फ़ंक्शन अनुरोधित एफडी को खोलता है (और लौटाता है) और define_if_is_the_higtest_fd_and_store_it()
नामक फ़ंक्शन पर अपना मान पास करता है।
आपके पास int hightest_fd_saved
केवल एक सिंगलटन फ़ंक्शन के लिए पहुंच योग्य होना चाहिए (save_fd()
नामक केवल 1 'वर्णक तालिका') (प्रारंभिक मान 3 है (cuz stderr
2 है)।
अपने सिग्नल फ़ंक्शन पर SIGINT
कॉन्फ़िगर करें। अंदर, आप [3, return_fd()
] से एक लूप करते हैं।
मुझे लगता है कि यह है ... संकेत संचालकों के लिए
खोजें। –
आप ऐसी चीज क्यों चाहेंगे? – qdot
आपके बाहर निकलने के बाद(); या 'वापसी' मुख्य से, कर्नेल को आपके लिए उन फाइल डिस्क्रिप्टर को बंद करना चाहिए। – yeyo