首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现对调试器文件的写函数

实现对调试器文件的写函数
EN

Stack Overflow用户
提问于 2014-10-09 06:51:58
回答 1查看 3.1K关注 0票数 2

我尝试实现对调试器文件的写函数。我希望我可以使用echo "hello" > /sys/kernel/debugfs/mydir/myfile将字符串写入文件。并使用echo "world" >> /sys/kernel/debugfs/mydir/myfilehello之后追加world。我在我的实现中发现了两个问题。一个是如果输入字符串的长度超过缓冲区大小,echo命令就会卡住。另一个是echo "world" >> /sys/kernel/debugfs/mydir/myfile从不追加字符串。相反,它是新的字符串。以下是我的执行情况。

代码语言:javascript
复制
#include <linux/module.h>       /* Needed by all modules */
#include <linux/kernel.h>       /* Needed for KERN_INFO */
#include <linux/init.h>         /* Needed for the macros */
#include <linux/miscdevice.h>
#include <linux/uaccess.h>
#include <linux/debugfs.h>
#include <linux/fs.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");

#define BUF_SIZE 10

static char foo_buf[BUF_SIZE];
static struct dentry *debug_dir;
static struct dentry *debug_foo;

static ssize_t foo_read(struct file *file, char __user *buf, size_t count,
            loff_t *f_pos)
{
    return simple_read_from_buffer(buf, count, f_pos, foo_buf, sizeof(foo_buf));
}

static ssize_t foo_write(struct file *file, const char __user *buf, size_t count,
                    loff_t *f_pos)
{
    size_t ret;

    if (*f_pos > BUF_SIZE)
            return -EINVAL;
    ret = simple_write_to_buffer(foo_buf, sizeof(foo_buf), f_pos, buf, count);
    if (ret < 0)
            return ret;
    foo_buf[ret] = '\0';

    return ret;
}

static const struct file_operations foo_fops = {
    .owner = THIS_MODULE,
    .read = foo_read,
    .write = foo_write,
};

static int __init debugfs_start(void)
{

    pr_err("init debugfs");

    debug_dir = debugfs_create_dir("mydir", NULL);
    if (debug_dir == NULL) {
            pr_err("debugfs create my dir failed");
            return -ENOMEM;
    }

    debug_foo = debugfs_create_file("foo", 0744, debug_dir,
                                       NULL, &foo_fops);
    if (!debug_foo) {
            debugfs_remove(debug_dir);
            return -ENOMEM;
    }
    return 0;
}

static void __exit debugfs_end(void)
{
    pr_err("exit debugfs");
    debugfs_remove_recursive(debug_dir);
}

module_init(debugfs_start);
module_exit(debugfs_end);
EN

回答 1

Stack Overflow用户

发布于 2014-10-09 08:06:48

一个是,如果输入字符串的长度超过缓冲区大小,那么echo命令就会卡住。

这是因为每次尝试都失败时,它会不断地尝试写入文件。

另一个是>> /sys/内核/调试器/mydir/myfile从不追加字符串的回显"world“。相反,它是新的字符串。

在您的实现中,这是预期的。如果要将新字符串附加到现有字符串中,则需要将其禁止。也就是说,您需要保存字符串长度的记录。但这与f_pos不同,后者特定于进程的打开文件。

如何识别用户将使用哪些命令( echo >或echo >>)?

那么,您的意思是用户打开文件后是否“截断”文件?调试器似乎不支持搜索,但我想您可以提供您的.open函数和.llseek函数来实现这个功能。如果文件是用于追加的,则在打开该文件时,需要确保文件的末尾。

对不起,我不能提供完整的代码,只能提供一些提示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26272068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档