2015-06-15 5 views
20

मैं ऐसी स्थिति को उत्तेजित करना चाहता हूं जहां कोई फ़ाइल डिस्क्रिप्टर शेष नहीं है।मैं फ़ाइल डिस्क्रिप्टर की कमी का अनुकरण कैसे कर सकता हूं?

मैं सोच कर दिया गया है के बारे में 2 संभावनाएं:

  1. फ़ाइलों के हजारों खुलने बेतरतीब ढंग से खुला का परिणाम जब तक है -1
  2. उपलब्ध फ़ाइल डिस्क्रिप्टर का एक बहुत कम संख्या सेट (मान लें stdin, stdout और stderr)।

आप यह कैसे करेंगे?

उत्तर

31

आप फाइल डिस्क्रिप्टरों की संख्या को सीमित कर सकते हैं जो एक प्रक्रिया लिनक्स के तहत उलिमिट का उपयोग कर खुल सकती है।

अपने सी प्रोग्राम चलाने से पहले ulimit -n 3 निष्पादित करने से इसे और भी फाइलें खोलने में त्रुटि होनी चाहिए, क्योंकि stdin, stdout, और stderr पहले 3 वर्णनकर्ताओं को लेते हैं।

एक उदाहरण:

$ ulimit -n 3 
$ echo > /dev/null 
zsh: too many open files: /dev/null 

खोल प्रक्रिया ही खोलने के लिए/dev/बातिल यह वहाँ बंद करने से पहले stdout रीडायरेक्ट करने का प्रयास है, इसलिए यह एक त्रुटि हो जाता है। आपके सी प्रोग्राम को पहली बार फॉपेन, खुला, सॉकेट, आदि (या कोई भी जो नई फ़ाइल डिस्क्रिप्टर आवंटित करता है) को ठीक उसी त्रुटि में खिलाया जाएगा।

+8

या सी – o11c

+0

से ['setrlimit'] (http://linux.die.net/man/2/setrlimit) का उपयोग करें क्या शैल बाहरी प्रोग्राम को उत्पन्न करते समय फ़ाइल डिस्क्रिप्टर बनाते हैं? मुझे लगता है कि एक पाइपलाइन को कम से कम 'पाइप (2)' का उपयोग करने की आवश्यकता होगी और विभिन्न प्रकार के प्रतिस्थापन भी मुद्दों का कारण बन सकते हैं। कम से कम, आपको अवगत होना चाहिए कि यह उल्लिट आपके खोल को बहुत ही बाधित कर देगा। – Kevin

+0

@ केविन, पुनर्निर्देशन 'डुप्लिकेट (2) ',' डुप् 2 (2) ', या' पाइप (2) 'के माध्यम से किया जा सकता है, लेकिन जब खोल केवल एक प्रोग्राम और केवल कांटेदार बनाता है और' execve (2)' जो उपप्रोसेसर को नए बनाए बिना पहले 3 वर्णनकर्ताओं से गुज़रता है। वास्तविक पुनर्निर्देशन के लिए, चाहे आप जो भी उपयोग करते हैं, एक वर्णक बनाया गया है, क्योंकि वर्णनकर्ता को फिर से सौंपे जाने से पहले डुप्लिकेट किया गया है, क्योंकि stdin पहले से ही शैल के stdin वर्णनकर्ता से जुड़ा हुआ है। आपकी ऊपरी सीमा तक परीक्षण के बाद सीमा को फिर से उठाया जा सकता है ('ulimit -n' के साथ डिफ़ॉल्ट देखें)। – Matthew

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