2009-08-22 9 views
10

मैं किसी प्रक्रिया में सभी खुली फ़ाइलों को कैसे ढूंढूं (स्वयं के अंदर से)?किसी प्रक्रिया में सभी खुली फ़ाइलों को बंद करना

fork() (exec() से पहले) के बाद यह जानना उपयोगी लगता है।

मैं getdtablesize() के अस्तित्व और अधिक पोर्टेबल sysconf(_SC_OPEN_MAX) के बारे में पता है, लेकिन यह लगा सकते हैं कि इसके पीछे या नहीं एक फ़ाइल खोलने हर वैध फ़ाइल वर्णनकर्ता को बंद करने का प्रयास करने के, अक्षम लगता है। (मैं समयपूर्व अनुकूलन के खतरों से भी अवगत हूं, यह अनुमान है कि सौंदर्यशास्त्र के बारे में मुझे लगता है :-)

उत्तर

3

यह सभी फ़ाइल वर्णनकर्ताओं को बंद करने का प्रयास करने में अक्षम हो सकता है, लेकिन वास्तव में यह बुरा नहीं है। सिस्टम डिस्क्रिप्टर को देखने के लिए सिस्टम कॉल कार्यान्वयन सिस्टम को अच्छा होने पर काफी कुशल होना चाहिए।

यदि आप केवल खुले फ़ाइल डिस्क्रिप्टर को बंद करना चाहते हैं, तो आप सिस्टम पर प्रो फाइल सिस्टम का उपयोग कर सकते हैं जहां यह मौजूद है। जैसे लिनक्स पर,/proc/self/fd सभी खुले फ़ाइल डिस्क्रिप्टर सूचीबद्ध करेगा। उस निर्देशिका पर Iterate, और सबकुछ बंद करें> 2, फ़ाइल डिस्क्रिप्टर को छोड़कर जो उस निर्देशिका को इंगित करता है जिस पर आप पुनरावृत्त कर रहे हैं।

8

अपने कार्यक्रम fork और exec कॉल करेंगे, तो आप वास्तव में सभी फाइल वर्णनकर्ता O_CLOEXEC ध्वज के साथ खोलने तो आप मैन्युअल रूप से exec से पहले उन्हें बंद करने के लिए नहीं है चाहिए। फ़ाइल खोले जाने के बाद आप इस ध्वज को जोड़ने के लिए fcntl का भी उपयोग कर सकते हैं, लेकिन यह बहुप्रचारित कार्यक्रमों में दौड़ की स्थिति के अधीन है।

+0

दौड़ में आपका स्वागत है। – ybungalobill

संबंधित मुद्दे