2012-10-27 11 views
5

प्राप्त करें मैं अपने सी प्रोग्राम में व्यवहार को कार्यान्वित करना चाहता हूं ताकि यदि एक सिगिनट होता है, तो मैं सभी खुली फ़ाइल डिस्क्रिप्टर बंद करता हूं। क्या उनकी सूची पाने का कोई आसान तरीका है?सी सभी खुली फ़ाइल डिस्क्रिप्टर

+2

खोजें। –

+1

आप ऐसी चीज क्यों चाहेंगे? – qdot

+1

आपके बाहर निकलने के बाद(); या 'वापसी' मुख्य से, कर्नेल को आपके लिए उन फाइल डिस्क्रिप्टर को बंद करना चाहिए। – yeyo

उत्तर

5

मैं ब्रूट फोर्स का उपयोग करता हूं: for (i = 0; i < fd_max; ++i) close (i);। त्वरित और सुंदर पोर्टेबल।

+0

स्पष्ट रूप से बहुत आसान, हाँ! -) लेकिन दौड़ अभी भी एक मुद्दा हो सकता है। – alk

+3

अधिकतम 'fd_max' खोजने के लिए आप' getrlimit (RLMIIT_NOFILE, और rlim) 'का उपयोग करना चाहेंगे। –

+0

क्या आप वाकई 'stdin' के लिए फ़ाइल डिस्क्रिप्टर को बंद करना चाहते हैं। 'stdout' और' stderr' (0, 1, 2)? – alk

3

अपने सभी खुले फ़ाइल डिस्क्रिप्टरों का ट्रैक रखें और उन्हें अलग-अलग बंद करें।

सामान्य स्थिति में, आपके द्वारा उपयोग की जाने वाली लाइब्रेरी में एक खुली फ़ाइल हो सकती है, और इसे बंद करने से वह लाइब्रेरी गलत व्यवहार कर सकती है।

वास्तव में, वही समस्या आपके कोड में मौजूद हो सकती है, क्योंकि यदि आप फ़ाइल डिस्क्रिप्टर को अंधाधुंध रूप से बंद करते हैं लेकिन आपके प्रोग्राम का एक और हिस्सा अभी भी फाइल डिस्क्रिप्टर को याद करता है और इसका उपयोग करने का प्रयास करता है, तो उसे एक अनपेक्षित त्रुटि मिलेगी या (यदि अन्य फाइलें तब से खोली गई हैं) गलत फ़ाइल पर काम करती है। फ़ाइल खोलने के लिए ज़िम्मेदार घटक के लिए यह बहुत बेहतर है, इसे बंद करने के लिए जिम्मेदार भी है।

2

यदि आप उपलब्ध हैं, तो आप /proc/<pid>/fd. की सामग्री को पढ़ सकते हैं।

लेकिन संभावित दौड़ के बारे में जागरूक रहें, जो तब हो सकता है जब आपका एप्लिकेशन कुछ पढ़ता है या आपके पढ़ने के बीच /proc/<pid>/fd के बीच नए खुलता है और आप जो पढ़ते हैं उसे बंद करने जा रहे हैं।

तो मुझे लगता है कि मैं केविन रीड के दृष्टिकोण की सिफारिश करना चाहता हूं।

+0

आप क्यों मानते हैं, '/ proc' उपलब्ध है? यह अस्तित्व में सबसे अयोग्य दुःस्वप्न के बारे में है। – Jens

+0

आप सही हैं। मैंने अपनी टिप्पणी को केवल कुछ सिस्टम के लिए उपयुक्त होने के लिए संशोधित किया। @ जेन्स – alk

+0

यदि पोर्टेबिलिटी के बारे में चिंतित है, तो आप '/ dev/fd /' पढ़ सकते हैं। यह '/ proc/self/fd' से अधिक पोर्टेबल है। –

1

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()] से एक लूप करते हैं।

मुझे लगता है कि यह है ... संकेत संचालकों के लिए

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