2009-02-26 9 views
6

मैं /proc/driver निर्देशिका के तहत एक फ़ाइल बनाना चाहता हूं। मैं स्पष्ट रूप से "ड्राइवर/MODULE_NAME" का उपयोग करने के बजाय proc_root_driver (या कुछ और प्रदान किया गया) जैसे मैक्रो का उपयोग करना चाहता हूं। मैं create_proc_entry का उपयोग करें:/proc/driver के अंतर्गत proc प्रविष्टि कैसे बनाएं?

struct proc_dir_entry *simpleproc_fops_entry; 
simpleproc_fops_entry = create_proc_entry(MODULE_NAME, 0400, NULL /* proc_root_dir */); 

googling के बाद, मैं proc_root_driver उपयोग करने के लिए सुझाव पाया, लेकिन जब मैं इसका इस्तेमाल, मैं त्रुटि इस समारोह में

proc_root_driver अघोषित मिल

और भी , proc_root_driver linux/proc_fs.h में उपलब्ध नहीं है।

मैं इस तरह की संरचना की घोषणा करने की कोशिश की है:

struct proc_dir_entry proc_root; 
struct proc_dir_entry *proc_root_driver = &proc_root; 

संकलन त्रुटियों चले गए, लेकिन फाइल /proc/driver या /proc के तहत दिखाई नहीं दिया। मैं /proc में एक प्रविष्टि कैसे बना सकता हूं?

extern struct proc_dir_entry *proc_root_driver; 

इतने लंबे समय के रूप में CONFIG_PROC_FS सक्षम है:

उत्तर

4

proc_fs.h को देखते हुए, proc_root_driver के रूप में परिभाषित किया गया है। आपके द्वारा चयनित CONFIG_PROC_FS है, तो जब आप अपने कर्नेल कॉन्फ़िगर करते हैं, आप इसे उपयोग करने में सक्षम के रूप में आप अपने आप को सुझाव दिया अर्थात होना चाहिए:

#include <linux/proc_fs.h> 
struct proc_dir_entry * procfile 
procfile = create_proc_entry("myprocfile", 0400, proc_root_driver); 

अगर यह काम नहीं करता है, जाँच आप सेट CONFIG_PROC_FS है। यह सुनिश्चित करने के लिए, आप अपनी स्रोत फ़ाइल को -E विकल्प के साथ संकलित कर सकते हैं और जांच सकते हैं कि create_proc_entry कॉल में अंतिम पैरामीटर के रूप में एक गैर NULL पैरामीटर शामिल है। यदि यह शून्य है, या कॉल बिल्कुल नहीं है, तो CONFIG_PROC_FS सक्षम नहीं है।

3
/* proc entries for ayyaz */ 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/slab.h> 
#include <linux/string.h> 
#include <linux/timer.h> 
#include <linux/major.h> 
#include <linux/fs.h> 
#include <linux/err.h> 
#include <linux/ioctl.h> 
#include <linux/init.h> 
#include <linux/proc_fs.h> 

#ifdef CONFIG_PROC_FS 

/*====================================================================*/ 
/* Support for /proc/ayyaz */ 

static struct proc_dir_entry *proc_ayyaz; 

DEFINE_MUTEX(ayyaz_table_mutex); 


/*====================================================================*/ 
/* Init code */ 
static int ayyaz_read_proc (char *page, char **start, off_t off, int count, 
          int *eof, void *data_unused) 
{ 
     int len, l, i; 
     off_t begin = 0; 

     mutex_lock(&ayyaz_table_mutex); 

     len = sprintf(page, "hello ayyaz here\n"); 
     mutex_unlock(&ayyaz_table_mutex); 
     if (off >= len+begin) 
       return 0; 
     *start = page + (off-begin); 
     return ((count < begin+len-off) ? count : begin+len-off); 
} 


static int __init init_ayyaz(void) 
{ 
     if ((proc_ayyaz = create_proc_entry("ayyaz_maps", 0, NULL))) 
       proc_ayyaz->read_proc = ayyaz_read_proc; 
     return 0; 
} 

static void __exit cleanup_ayyaz(void) 
{ 
     if (proc_ayyaz) 
       remove_proc_entry("ayyaz", NULL); 
} 

module_init(init_ayyaz); 
module_exit(cleanup_ayyaz); 
#else 
#error "Please add CONFIG_PROC_FS=y in your .config " 
#endif /* CONFIG_PROC_FS */ 


MODULE_LICENSE("proprietary"); 
MODULE_AUTHOR("Md.Ayyaz A Mulla <[email protected]>"); 
MODULE_DESCRIPTION("proc files for ayyaz"); 

इस ड्राइवर संकलित करें। यदि यह सफलतापूर्वक संकलित करता है, तो आप /proc/ayyaz देखेंगे।

+0

@ एमडीएयाज: स्टैक ओवरफ़्लो में आपका स्वागत है :)। मैंने आपके कोड स्वरूपण को ठीक करने की स्वतंत्रता ली - कोड नमूने को इंडेंट करने की आवश्यकता है (और स्वचालित रूप से ऐसा करने के लिए टूलबार में एक बटन है)। –

0
#define PROC_ENTRY_NAME "driver/XX" 
static struct proc_dir_entry *proc_XX; 

static int XX_read_proc (char *page, char **start, off_t off, int count, 
    int *eof, void *data_unused) 
{ 
    return 0; 
} 
static int XX_write_proc (struct file *file, const char __user *buffer, 
    unsigned long count, void *data) 
{ 
    return 0; 
} 

static int __init XX_add_driver(void) 
{ 
    if ((proc_flash = XX_entry(PROC_ENTRY_NAME, 0, NULL))) { 
     proc_XX->read_proc = XX_read_proc; 
     proc_XX->write_proc = XX_write_proc; 
    } 
... 
} 

static void __exit XX_remove(void) 
{ 
    if (proc_flash) 
     remove_proc_entry(PROC_ENTRY_NAME, NULL); 

    return; 
} 

फिर आप /proc/driver/XX प्रविष्टि पा सकते हैं।

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