2011-11-09 13 views
5

मैं 64-बिट लिनक्स पर फ़ाइल डिस्क्रिप्टर के लिए इंतजार करने के लिए epoll_wait का उपयोग कर एक प्रोग्राम लिख रहा हूं, और मैं epoll_event उपयोगकर्ता डेटा में फ़ाइल वर्णनकर्ता के साथ कुछ जानकारी एक साथ रखने का प्रयास करता हूं।64-बिट लिनक्स पर फ़ाइल डिस्क्रिप्टर की सीमा क्या है?

मुझे अभ्यास में पता है कि यह संभावना नहीं है कि फाइल डिस्क्रिप्टर 32 बिट्स से अधिक हो जाएगा। बस जानना है कि कर्नेल गारंटी देता है कि फाइल डिस्क्रिप्टर की एक विशिष्ट सीमा है, या यह बहुत छोटा और असंभव होने की संभावना है?

+0

मुझे लगता है कि एफडी संख्याओं का पुनर्नवीनीकरण किया जाएगा - उदा। प्रक्रिया के लिए समवर्ती खुले डिस्क्रिप्टरों की उच्चतम संख्या से अधिक कभी नहीं - लेकिन .... मुझे कोई सुराग नहीं है। –

+0

एफडी परिभाषा के अनुसार एक "छोटा" गैर-नकारात्मक int है, जो भी "छोटा" रन टाइम पर है। इसके अलावा, कर्नेल इसके मूल्य की कोई गारंटी नहीं देता है। –

उत्तर

9

epoll_ctl(2) इंटरफ़ेस नए दायरस्क्रिप्टर्स जोड़ने के लिए int fd तर्क लेता है, इसलिए आप पहले ही 32-बिट रेंज तक सीमित हैं (कम से कम लिनक्स प्लेटफॉर्म पर मैं परिचित हूं)।

आप सभी प्रक्रियाओं के लिए खुली फ़ाइलों की संख्या पर सिस्टम-व्यापी सीमा /proc/sys/fs/file-max द्वारा सीमित हैं; /proc/sys/fs/file-max वर्तमान में 595956 है मेरे सिस्टम पर।

प्रत्येक प्रक्रिया को setrlimit(2)RLIMIT_NOFILE खुली फ़ाइलों की संख्या पर प्रति-प्रक्रिया सीमा के माध्यम से आगे सीमित किया गया है। 1024 एक आम RLIMIT_NOFILE सीमा है। (/etc/security/limits.conf के माध्यम से इस सीमा को बदलना बहुत आसान है।)

यह एक दुर्लभ एप्लिकेशन है जिसे 1024 से अधिक की आवश्यकता है। पूर्ण 32 बिट्स भी असंभव दिखाई देते हैं, क्योंकि प्रत्येक खुली फ़ाइल कुछ कर्नेल मेमोरी को प्रतिनिधित्व करने के लिए ले जाएगी - चार बिलियन ~ 280 बाइट struct inode संरचनाएं (न्यूनतम पर) एक पिन पिन की गई मेमोरी है।

+0

धन्यवाद, ऐसा लगता है कि मैं सुरक्षित रूप से उपयोग के लिए कुछ अतिरिक्त बचा सकता हूं। –

2

क्या आप 2 अरब फ़ाइल डिस्क्रिप्टर खोलने की योजना बना रहे हैं, और क्या आप ओएस को संभालने की उम्मीद करते हैं?

अधिकांश * निक्स में, एफडी वापस करने वाले फ़ंक्शन इसे int के रूप में वापस भेजते हैं, < 0 एक अवैध वर्णनकर्ता होने के साथ। वे फ़ंक्शन int में एफडी वापस करते हैं, ताकि प्रकार की सीमा एफडी के लिए सीमा हो। (नकारात्मक से कम (कोई इरादा नहीं है)) मैं सूट का पालन करता हूं: इस प्रकार, int का उपयोग करें।

1

मुझे कर्नेल में एक टिप्पणी मिली जिसमें हार्ड ऊपरी सीमा 1024 * 1024 है।

-1

64-बिट पर फ़ाइल डिस्क्रिप्टर की श्रेणी (32-बिट सिस्टम के लिए भी लागू) लिनक्स 0 से 1023 है, तो आप 1023 खोले गए फाइल-डिस्क्रिप्टर को और अधिक नहीं बना सकते हैं। आप 1023 फ़ाइल-डिस्क्रिप्टर को और अधिक खोलने का प्रयास करते हैं, तो सिस्टम त्रुटि ईबीएडीएफ (खराब फ़ाइल डिस्क्रिप्टर), त्रुटि संख्या - 9

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