在/ proc中写入文件会不断淹没dmesg

问题描述 投票:1回答:1

我正在尝试使用/ proc文件输入工具在Linux内核模块中读取/写入变量。内核模块编译成功,但是尝试通过

编写
echo 1 > My_file

此操作未完成。

而且,dmesg控制台不断充斥一些随机值。

[ 1171.481231] proc_write_flag New_Flag 1124646486
[ 1171.481245] proc_write_flag New_Flag 1124646486
[ 1171.481259] proc_write_flag New_Flag 1124646486
[ 1171.481271] proc_write_flag New_Flag 1124646486
[ 1171.481473] ^C

我是linux设备驱动程序的新手,正在尝试使用linux内核提供的/proc工具。我尝试删除此内核模块,但是再次,操作未完成

什么原因导致了这种行为,我该如何纠正?

这里是代码:

int my_flag;
static struct proc_dir_entry *pdir = NULL;

MODULE_LICENSE("GPL");
MODULE_AUTHOR("GPL");

static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count, loff_t *offset);
static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset);

static struct file_operations myops = 
{
    .owner = THIS_MODULE,
    .read = proc_read_flag,
    .write= proc_write_flag,
};


//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count,loff_t *offset)
{
    int len=0;

    printk("%s Flag %d\n",__FUNCTION__,my_flag);
    //len = sprintf(,"%d\n",my_flag);
    return len;
}

//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset)
{
    int len= 0, value= 0, i=0, ret = 0;
    char buf[WRITE_BUF_SIZE] ;

    printk("%s Cur_Flag %d\n",__FUNCTION__,my_flag);

    if( copy_from_user(buf,ubuf,1) ){
        return -EFAULT;
    }

    my_flag = (int)buf;

    printk("%s New_Flag %d\n",__FUNCTION__,my_flag);
    return ret;
}


int init_module(void)
{
    struct proc_dir_entry *pfile = NULL;

    pdir = proc_mkdir("My_dir",NULL);
    if(!pdir){
        return -ENOMEM;
    }

    pfile = proc_create("My_file", 0666, pdir, &myops);
    if(!pfile)
        return -ENOMEM;


    printk("Proc_entry Created Successfully, Module initialized\n");
    return 0;
}

void cleanup_function(void)
{
    remove_proc_entry("My_file", pdir);
    remove_proc_entry("My_dir", NULL);
    printk("Removing Proc_entry!!!");
}
c linux-kernel linux-device-driver device-driver
1个回答
1
投票

写入功能应返回您处理的字节数。

在您的情况下,'proc_write_flag'函数返回的'ret'为0。这意味着它将被重复调用,直到您处理'ubuf'中的'count'个字节为止。

同样,'proc_read_flag'应该返回您写入'data'的字节数。您的情况是返回0(len)

'proc_write_flag'函数中还有其他问题。

'buf'数组未初始化,并且将'buf'(地址)强制转换为int不会给您预期的答案。

以此http://tuxthink.blogspot.com/2013/12/creating-directory-under-proc-in-kernel.html开头

然后查看kstrtol()函数。

© www.soinside.com 2019 - 2024. All rights reserved.