【问题标题】:Data is not written into /proc file数据未写入 /proc 文件
【发布时间】:2016-03-07 14:47:29
【问题描述】:

我写了一个内核模块来创建一个 /proc 文件。我还编写了一个写入文件的用户空间代码,然后使用“copy_from_user”方法将写入的数据提取到我的模块并打印到内核日志中。

数据已成功写入日志,但是当我在编辑器中打开 proc 文件时,它是空白的。

谁能解释一下为什么会这样?

用户空间代码是

#include<fcntl.h>

main()
{
    int fd=open("/proc/MY_PROC_FILE", O_RDWR);
    write(fd, "linux is awesome", 16);
    return 0;
}

模块是

int open_callback(struct inode *p, struct file *q)
{
    printk(KERN_ALERT "open callback\n");
    return 0;
}

ssize_t write_callback(struct file *p, const char __user *buffer, size_t len, loff_t *s)
{
    printk(KERN_ALERT "write callback\n");
    char msg[256];
    copy_from_user(msg, buffer, len);
    printk("%s\n", msg);
    return 0;
}

static struct proc_dir_entry *my_proc_entry;

static struct file_operations fs={
    .open=open_callback,
    .read=read_callback,
    .write=write_callback,
    .release=release_callback
};

static int start(void)
{
    printk(KERN_ALERT "proc module registered\n");
    my_proc_entry=proc_create(file_name, 0, NULL, &fs);
    if(my_proc_entry==NULL)
    {
            printk(KERN_ALERT "os error\n");
            return -ENOMEM;
    }
    return 0;
}

static void stop(void)
{
    remove_proc_entry(file_name, NULL);
    printk(KERN_ALERT "proc module unregistered\n");
}

module_init(start);
module_exit(stop);
MODULE_LICENSE("GPL");

提前感谢您的帮助

【问题讨论】:

    标签: c linux-kernel operating-system kernel


    【解决方案1】:

    你没有实现read_callback()

    当您读取该 proc 文件时,将调用 read_callback()。这里你需要编写代码来写回(使用copy_to_user())之前在write_callback()回调中写的内容。

    首先,您需要将用户在 write_callback() 中写入的内容存储在内核空间的某个全局内存中,然后只有您可以将其写回 read_callback()

    这是您想要做的最好的例子。 http://www.makelinux.net/books/lkmpg/x810

    【讨论】:

    • 抱歉迟到了....我实现了 read_callback() 方法但是没有用....整个模块都在这里...dpaste.com/1G021KE...uspace 代码是@ 987654323@ ...如果根据您的说法,我们必须实现 read_callback() 方法,那么其他 proc 文件呢?它们的内容是如何编写的...是否有任何用户空间系统守护进程为这些 proc 文件实现 read_callback
    • @DebeshMohanty Procfs 是特殊文件。这里 read_callback 将被多次调用,因此您需要实现这样的逻辑,即当它第一次调用时,它将缓冲区复制到用户空间并返回缓冲区的大小,然后函数应始终返回零。请参阅makelinux.net/books/lkmpg/x810 中的此逻辑 procfs_read()
    猜你喜欢
    • 2015-07-21
    • 2016-03-06
    • 1970-01-01
    • 2020-12-23
    • 2020-09-16
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多