से अधिक लंबा है, तो मुझे fanotify से फाइल सिस्टम ईवेंट प्राप्त होते हैं। कभी-कभी मैं उस फ़ाइल के लिए एक पूर्ण पथ प्राप्त करना चाहता हूं जिसे एक्सेस किया जा रहा है।पथ वर्णनकर्ता से पथ प्राप्त करें जब पथ PATH_MAX
आमतौर पर, यह एक समस्या नहीं है - तो मैं /proc/self/fd/<fd>
पर readlink
फोन और मेरे पथ प्राप्त कर सकते हैं fanotify_event_metadata
, एक फ़ाइल वर्णनकर्ता fd
शामिल हैं।
हालांकि, यदि PATH_MAX
readlink
से अधिक पथ का उपयोग नहीं किया जा सकता है - यह ENAMETOOLONG
के साथ विफल रहता है। मैं सोच रहा हूं कि इस मामले में फ़ाइल पथ प्राप्त करने का कोई तरीका है या नहीं।
जाहिर है, मैं fstat
वर्णनकर्ता हूं जो मुझे प्रशंसक से मिलता है और संपूर्ण फाइल सिस्टम को समान डिवाइस आईडी और इनोड नंबर वाली फ़ाइलों की तलाश में ले जाता है। लेकिन यह दृष्टिकोण मेरे लिए प्रदर्शन-योग्य नहीं है (भले ही मैं इसे PATH_MAX
से कम पथों को अनदेखा करने के लिए अनुकूलित करता हूं)।
मैंने fd
को O_PATH
के साथ फिर से खोलकर और openat(fd, "..", ...)
पर कॉल करके एक मूल निर्देशिका प्राप्त करने का प्रयास किया है। जाहिर है, यह असफल रहा क्योंकि fd
किसी निर्देशिका का संदर्भ नहीं देता है। असफल readlink
कॉल के बाद मैंने बफर की सामग्री की जांच करने का भी प्रयास किया है (उम्मीद है कि इसमें आंशिक पथ है)। वह या तो काम नहीं किया।
अभी तक मैंने उन्हें खोले गए प्रक्रिया की कार्यशील निर्देशिका के अंदर फ़ाइलों के लिए लंबे पथ प्राप्त करने में कामयाब रहे हैं (फैनोटिफ़ाई ईवेंट में लक्ष्य प्रक्रिया के pid
शामिल हैं, इसलिए मैं /proc/<pid>/cwd
पढ़ सकता हूं और रूट से पथ प्राप्त कर सकता हूं क्या आप वहां मौजूद हैं)। लेकिन यह एक आंशिक समाधान है।
क्या संपूर्ण फाइल सिस्टम को घुमाने के बिना फ़ाइल डिस्क्रिप्टर से पूर्ण पथ प्राप्त करने का कोई तरीका है? अधिमानतः वह कर्नेल 2.6.32/glibc 2.11 के साथ काम करेगा।
अद्यतन: उत्सुक के लिए। मुझे पता चला है कि readlink("/proc/self/fd/<fd>", ...
क्यों बुलाकर पूरे पथ को स्टोर करने के लिए काफी बड़ा काम नहीं करता है।
do_proc_readlink के कार्यान्वयन को देखें। ध्यान दें कि यह सीधे buffer
प्रदान नहीं करता है। इसके बजाए, यह एक पृष्ठ को आवंटित करता है और इसे अस्थायी बफर के रूप में उपयोग करता है जब यह d_path पर कॉल करता है। दूसरे शब्दों में, कोई फर्क नहीं पड़ता कि buffer
कितना बड़ा है, d_path
हमेशा किसी पृष्ठ के आकार तक सीमित रहेगा। Amd64 पर 4096 बाइट्स कौन सा है। PATH_MAX
के समान! -ENAMETOOLONG
स्वयं prepend द्वारा वापस आ गया है जब यह उल्लिखित पृष्ठ से बाहर हो जाता है।
क्या अंतिम हल किए गए पथ लिंक और/या '.' /' ..' 'PATH_MAX' से अधिक तत्व हैं? यदि नहीं, तो 'realpath() 'आपके लिए काम कर सकता है: http://man7.org/linux/man-pages/man3/realpath.3.html –
पथ नहीं हैं, ठीक है,' PATH_MAX' से छोटा वर्ण? यह अजीब लगता है। – unwind
@AndrewHenle, 'realpath' को पहले स्थान पर एक पथ की आवश्यकता है। मेरे पास एक फाइल डिस्क्रिप्टर और एक पीआईडी है। –