在内核中创建一个简单的只写proc条目

时间:2016-12-05 23:49:47

标签: c linux linux-kernel linux-device-driver procfs

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include<linux/sched.h>
#include <asm/uaccess.h>
#include <linux/slab.h>

char *msg;

ssize_t write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp)
{
    copy_from_user(msg,buf,count);
    printk(KERN_INFO "%s",msg);

    return count;
}

struct file_operations proc_fops = {
    write: write_proc
};


int proc_init (void) {
    proc_create("write",0,NULL,&proc_fops);

    return 0;
}

void proc_cleanup(void) {
    remove_proc_entry("write",NULL);
}

MODULE_LICENSE("GPL"); 
module_init(proc_init);
module_exit(proc_cleanup);

当我使用命令echo 'hello' > /proc/write时,终端上没有显示任何内容。你能帮我找到代码中的错误吗?我在它上面写的字符串应该显示在终端上。

示例:

$ echo'hello'&gt;的/ proc /写

您好

1 个答案:

答案 0 :(得分:3)

以下是对您的代码的一些简单修改:

#define MSG_SIZE (512)
static char *msg;

#define ourmin(a,b) (((a)<(b)) ? (a) : (b))

ssize_t write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp)
{
   unsigned long actual_len = ourmin(count, MSG_SIZE-1);
   memset(msg, 0, MSG_SIZE);
   copy_from_user(msg, buf, actual_len);

   printk(KERN_DEBUG "Got: %s",msg);

   return count;
}

int proc_init (void) {
  // Allocate space for msg
  if ((msg = kmalloc(MSG_SIZE, GFP_KERNEL)) == NULL)
    return -ENOMEM;

  // Should check the output of this too
  proc_create("write",0,NULL,&proc_fops);

  return 0;
}

void proc_cleanup(void) {
    remove_proc_entry("write",NULL);
    kfree(msg);
}

我可以在内核日志中检索输出(例如dmesg)。