मुझे लिखे गए एक छोटे लिनक्स कर्नेल मॉड्यूल के अंदर, किसी दिए गए फ़ाइल डिस्क्रिप्टर से फ़ाइल का नाम प्राप्त करने की आवश्यकता है। मैंने Getting Filename from file descriptor in C पर दिए गए समाधान की कोशिश की, लेकिन किसी कारण से, यह कचरे के मूल्यों को प्रिंट करता है (समाधान में उल्लिखित /proc/self/fd/NNN
पर readlink
का उपयोग करने पर)। मैं यह कैसे कर सकता हूं?कर्नेल मॉड्यूल के अंदर फ़ाइल डिस्क्रिप्टर से फ़ाइल नाम कैसे प्राप्त किया जा सकता है?
उत्तर
SYS_readlink
पर कॉल न करें - उसी विधि का उपयोग करें जो procfs
करता है जब उन लिंक में से एक पढ़ा जाता है। proc_pid_readlink()
और proc_fd_link()
में fs/proc/base.c
में कोड के साथ प्रारंभ करें।
, यह देखते हुए एक int fd
और एक struct files_struct *files
आप में रुचि रखते हैं (जो आप के लिए एक संदर्भ ले लिया है) कर रहे हैं काम से, आप क्या करना चाहते हैं: अपने कोड प्रक्रिया में चल रहा है
char *tmp;
char *pathname;
struct file *file;
struct path *path;
spin_lock(&files->file_lock);
file = fcheck_files(files, fd);
if (!file) {
spin_unlock(&files->file_lock);
return -ENOENT;
}
path = &file->f_path;
path_get(path);
spin_unlock(&files->file_lock);
tmp = (char *)__get_free_page(GFP_KERNEL);
if (!tmp) {
path_put(path);
return -ENOMEM;
}
pathname = d_path(path, tmp, PAGE_SIZE);
path_put(path);
if (IS_ERR(pathname)) {
free_page((unsigned long)tmp);
return PTR_ERR(pathname);
}
/* do something here with pathname */
free_page((unsigned long)tmp);
संदर्भ (उदाहरण के लिए एक syscall के माध्यम से आवंटित) और फ़ाइल वर्णनकर्ता वर्तमान प्रक्रिया से है, तो आप मौजूदा कार्य के struct files_struct *
के लिए current->files
का उपयोग कर सकते हैं।
अच्छा। वह काम किया। धन्यवाद! हालांकि त्वरित प्रश्न। 'Path_get' और' path_put' कॉल किस उद्देश्य से सेवा करते हैं (क्योंकि उन्हें हटाने से मेरे प्रोग्राम पर अधिक प्रभाव नहीं पड़ता है)? साथ ही, कोई विचार क्यों 'sys_readlink' काम नहीं करेगा? – Siddhant
@ सिद्धांत: 'path_get() 'और' path_put() 'कॉल को शुद्धता के लिए आवश्यक है, क्योंकि वे पथ को पिन करते हैं ताकि जब आप इसके साथ काम करने की कोशिश कर रहे हों तो यह दूर नहीं जायेगा (सभी' संरचना पथ ' एक 'संरचना vfsmount' और' संरचना दांत 'के लिए पॉइंटर्स की एक जोड़ी है)। – caf
आह। एक बार फिर धन्यवाद! – Siddhant
- 1. फ़ाइल डिस्क्रिप्टर से नाम बदलें?
- 2. सेटअप फ़ाइल नाम निष्पादन योग्य फ़ाइल संस्करण संख्या से प्राप्त किया जा सकता है?
- 3. ओएसएक्स पर जावा में फ़ाइल के मालिक का नाम मुझे कैसे प्राप्त किया जा सकता है?
- 4. सॉकेट डिस्क्रिप्टर बनाम फ़ाइल डिस्क्रिप्टर
- 5. फ़ाइल फ़ाइल डिस्क्रिप्टर से फ़ाइल फ़ाइल निकालें या FILE *
- 6. क्या छोटे चर नाम से प्राप्त किया जा सकता है?
- 7. फ़ाइल डिस्क्रिप्टर
- 8. पायथन में __main__ मॉड्यूल के फ़ाइल नाम कैसे प्राप्त करें?
- 9. कर्नेल मॉड्यूल, जबकि एक प्रक्रिया से बुलाया जा रहा है,
- 10. अस्थायी फ़ाइल नाम कैसे प्राप्त करें?
- 11. इरादे से फ़ाइल नाम कैसे प्राप्त करें?
- 12. अंतर्निहित फ़ाइल डिस्क्रिप्टर
- 13. लिनक्स कर्नेल मॉड्यूल में फ़ाइल I/O
- 14. कैसे jFrames JavaFX के अंदर किया जा सकता है?
- 15. मैं लिनक्स कर्नेल मॉड्यूल के अंदर बैटरी स्तर कैसे प्राप्त कर सकता हूं?
- 16. डुप्लिकेट फ़ाइल डिस्क्रिप्टर अपनी फ़ाइल ऑफ़सेट
- 17. सॉकेट और फ़ाइल डिस्क्रिप्टर
- 18. फ़ाइल से फ़ाइल का नाम कैसे प्राप्त करें * सी
- 19. फ़ाइल पथ नाम से फ़ाइल नाम निकालने के लिए कैसे?
- 20. थ्रेड और फ़ाइल डिस्क्रिप्टर
- 21. java.io.FileNotFoundException: यह फ़ाइल फ़ाइल डिस्क्रिप्टर के रूप में नहीं खोली जा सकती है; यह शायद
- 22. फ़ाइल डिस्क्रिप्टर और फ़ाइल पॉइंटर के बीच क्या अंतर है?
- 23. वर्ग foo डिजाइन किया जा सकता है लेकिन फ़ाइल त्रुटि
- 24. दो फ़ाइल डिस्क्रिप्टर एक ही फ़ाइल में
- 25. मैं अपने जार फ़ाइल के अंदर से "फ़ोल्डर" संसाधन कैसे प्राप्त कर सकता हूं?
- 26. fdopen बुला: खराब फ़ाइल डिस्क्रिप्टर
- 27. सी सभी खुली फ़ाइल डिस्क्रिप्टर
- 28. सरल जावास्क्रिप्ट का उपयोग करके फ़ाइल का अपलोड आकार कैसे प्राप्त किया जा सकता है?
- 29. कर्नेल मॉड्यूल
- 30. एक InputStream (जावा) से फ़ाइल नाम प्राप्त
संभवतः डुप्लिकेट [sys_readlink EFAULT - वैकल्पिक] में विफल रहता है (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault- वैकल्पिक) – ephemient