尝试从内核空间向proc文件编写结构

时间:2014-08-15 00:15:24

标签: c linux linux-kernel kernel-module

我正在尝试将结构写入proc文件(我知道我不认为)。我能够使用seq_print方法成功写出结构成员,但我想尝试编写结构,所以我不必在用户空间中解析它。我不确定如何使用seq_file实现来写入它。下面是我正在尝试的代码。 seq_show函数是我的.read, file_operation struct回调机制的一部分(file_operationsseq_file.start.next.stop.show)从用户空间打开/proc/info

typedef struct tmp_t{
    int number;
    uint_32 info;
    char name[10];
} tmp_t;


static int seq_show(struct seq_file *s, void *v)
{
ssize_t proc_write;
mm_segment_t old_fs;
struct file *file;
loff_t offset = 0;

old_fs = get_fs();
set_fs(get_ds());
file = filp_open("/proc/info", O_WRONLY, 0777);
if(file){
      //tmp is a global pointer to the struct I want to write
      proc_write = vfs_write(file, tmp, sizeof(tmp_t), &offset);
      // I've also tried this using the v parameter
      //proc_write = vfs_write(file, tmp, sizeof(tmp_t), v);
      fput(file);
      printk(KERN_ALERT "proc_write: %zd.\n");
}
filp_close(file, NULL);
set_fs(old_fs);

return 0;
}

static void *info_start(struct seq_file *s, loff_t *pos)
{

}

static void *info_next(struct seq_file *s, void *v, loff_t *pos)
{

}

static void info_stop(struct seq_file *s, void *v)
{

}

static int open_info(struct inode *inode, struct file *file)
{
    return seq_open(file, &seq_ops_info);
}

static struct seq_operations seq_ops_info = {
    .start  = info_start,
    .next   = info_next,
    .stop   = info_stop,
    .show   = info_show,
};

static const struct file_operations fops_info = {
    .owner          = THIS_MODULE,
    .open           = open_info,
    .read           = seq_read,
    .llseek         = seq_lseek,
    .release        = seq_release,
 };

static int __init app_init(void)
{
info_file = proc_create("info", 0777, NULL, &fops_info);
}

printk语句给出了proc_write: -5.我将这些结构存储在一个链接列表中,所以每次迭代通过seq_file我想把结构写到/proc/info。我正在尝试使用我在内核源代码树中找到的example。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

据我所知,到目前为止,您无法轻松地在/proc中创建和编写文件。最有可能的是,filp_open()的来电失败,您无法正确查看其返回值。您必须使用IS_ERR()函数检查返回值。

但我要再次提到,这个想法对我来说似乎不对。如果要在/proc目录中创建条目,请考虑使用standard way