2011-12-15 13 views
27

Qualcuno può darmi l'esempio proc_create()?proc_create() esempio per modulo kernel

In precedenza hanno utilizzato create_proc_entry() nel kernel ma ora stanno utilizzando proc_create().

+1

perché non basta scaricare i sorgenti del kernel corrente e grep per proc_create? – Roland

risposta

30

Questo esempio creerà una voce proc che consente l'accesso alla lettura. Penso che sia possibile abilitare altri tipi di accesso modificando l'argomento mode passato alla funzione. Non ho passato una directory genitore perché non ce n'è bisogno. La struttura file_operations è quella in cui si imposta la lettura e la scrittura dei callback.

struct proc_dir_entry *proc_file_entry; 

static const struct file_operations proc_file_fops = { 
.owner = THIS_MODULE, 
.open = open_callback, 
.read = read_callback, 
}; 

int __init init_module(void){ 
    proc_file_entry = proc_create("proc_file_name", 0, NULL, &proc_file_fops); 
    if(proc_file_entry == NULL) 
    return -ENOMEM; 
    return 0; 
} 

È possibile controllare questo esempio per maggiori dettagli: https://www.linux.com/learn/linux-training/37985-the-kernel-newbie-corner-kernel-debugging-using-proc-qsequenceq-files-part-1

+0

Osservando le fonti del kernel dovrei fare un'osservazione. 'proc_file_fops' non deve essere lacated in una memoria di stack (funzione variabile locale). Deve essere una variabile globale o trovarsi nella memoria allocata con una funzione di memoria heap. –

21

Ecco un codice 'hello_proc', che si avvale della più recente 'proc_create) (' interfaccia.

#include <linux/module.h> 
#include <linux/proc_fs.h> 
#include <linux/seq_file.h> 

static int hello_proc_show(struct seq_file *m, void *v) { 
    seq_printf(m, "Hello proc!\n"); 
    return 0; 
} 

static int hello_proc_open(struct inode *inode, struct file *file) { 
    return single_open(file, hello_proc_show, NULL); 
} 

static const struct file_operations hello_proc_fops = { 
    .owner = THIS_MODULE, 
    .open = hello_proc_open, 
    .read = seq_read, 
    .llseek = seq_lseek, 
    .release = single_release, 
}; 

static int __init hello_proc_init(void) { 
    proc_create("hello_proc", 0, NULL, &hello_proc_fops); 
    return 0; 
} 

static void __exit hello_proc_exit(void) { 
    remove_proc_entry("hello_proc", NULL); 
} 

MODULE_LICENSE("GPL"); 
module_init(hello_proc_init); 
module_exit(hello_proc_exit); 

Questo codice è stato preso da http://pointer-overloading.blogspot.in/2013/09/linux-creating-entry-in-proc-file.html

+1

Grazie per un collegamento, davvero utile. Consiglio di leggere a quelli che vogliono capire come funziona. –

+1

Questo esempio con [QEMU + Buildroot test boilerplate] (https://github.com/cirosantilli/linux-kernel-module-cheat/blob/4727fadcc8f6e0685f80dc88a2913995a8df01f3/kernel_module/procfs.c). –

Problemi correlati