2011-11-23 16 views
13

मुझे लिखे गए एक छोटे लिनक्स कर्नेल मॉड्यूल के अंदर, किसी दिए गए फ़ाइल डिस्क्रिप्टर से फ़ाइल का नाम प्राप्त करने की आवश्यकता है। मैंने Getting Filename from file descriptor in C पर दिए गए समाधान की कोशिश की, लेकिन किसी कारण से, यह कचरे के मूल्यों को प्रिंट करता है (समाधान में उल्लिखित /proc/self/fd/NNN पर readlink का उपयोग करने पर)। मैं यह कैसे कर सकता हूं?कर्नेल मॉड्यूल के अंदर फ़ाइल डिस्क्रिप्टर से फ़ाइल नाम कैसे प्राप्त किया जा सकता है?

+0

संभवतः डुप्लिकेट [sys_readlink EFAULT - वैकल्पिक] में विफल रहता है (http://stackoverflow.com/questions/8216871/sys-readlink-fails-efault- वैकल्पिक) – ephemient

उत्तर

21

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 का उपयोग कर सकते हैं।

+0

अच्छा। वह काम किया। धन्यवाद! हालांकि त्वरित प्रश्न। 'Path_get' और' path_put' कॉल किस उद्देश्य से सेवा करते हैं (क्योंकि उन्हें हटाने से मेरे प्रोग्राम पर अधिक प्रभाव नहीं पड़ता है)? साथ ही, कोई विचार क्यों 'sys_readlink' काम नहीं करेगा? – Siddhant

+1

@ सिद्धांत: 'path_get() 'और' path_put() 'कॉल को शुद्धता के लिए आवश्यक है, क्योंकि वे पथ को पिन करते हैं ताकि जब आप इसके साथ काम करने की कोशिश कर रहे हों तो यह दूर नहीं जायेगा (सभी' संरचना पथ ' एक 'संरचना vfsmount' और' संरचना दांत 'के लिए पॉइंटर्स की एक जोड़ी है)। – caf

+0

आह। एक बार फिर धन्यवाद! – Siddhant

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