gpt4 book ai didi

linux - 在 3.11 或更高版本的现有子目录下创建 Proc fs 目录和条目?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:13 24 4
gpt4 key购买 nike

我知道这个问题已经被问过不止一次了。但真的没有一个好的答案。尽管我已经使用了很长时间以来的答案,但这是我第一次找不到解决方案。这是我的代码,非常适合:

首先在/proc 下创建一个目录,然后是第二个目录,然后是一个条目。该条目为空但可写。完美运行。

一些额外信息 ubuntu 14.04 内核更新 3.13.0-49-generic。 x86_64

这里是代码。

#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>
#include <linux/string.h>

static int len,temp;

static char *msg;
static char *dirname="mydriver";
static char *dirname2="settings";
struct proc_dir_entry *parent;
struct proc_dir_entry *parent2;
static ssize_t read_proc(struct file *filp,char *buf,size_t count,loff_t *offp )
{
if(count>temp){count=temp;}
temp=temp-count;
copy_to_user(buf,msg, count);
if(count==0){temp=len;}

return count;
}

static ssize_t write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp)
{
copy_from_user(msg,buf,count);
len=count;
temp=len;

return count;
}

struct file_operations proc_fops = {
read: read_proc,
write: write_proc
};

static void create_new_proc_entry(void)
{
parent = proc_mkdir(dirname, NULL);
parent2 = proc_mkdir(dirname2,parent);
proc_create("private_setting",0644,parent2,&proc_fops);
msg=kmalloc(GFP_KERNEL,10*sizeof(char));
}


static int proc_init (void)
{
create_new_proc_entry();
return 0;
}

static void proc_cleanup(void)
{
remove_proc_entry("private_setting",parent2);
proc_remove(parent2);
proc_remove(parent);
}

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

问题是如何在已经存在的子目录下创建目录和条目。例如/proc/driver。

我知道第一个父级是用 NULL 创建的,这意味着/proc。

但是要在/proc/driver 中设置 off NULL 什么的。我都试过了。什么都没用。

我找到了在/proc/driver 下创建目录和条目的解决方案。

只需在上面的代码中替换:

static char *dirname="mydriver";

下面一行:

static char *dirname="driver/mydriver";

最佳答案

我尝试在内核 3.2 上编译这段代码。不幸的是它没有编译。我很好地发现了一些小的变化,因此它可以在内核 3.2 上运行。它的好处是,通过这个小改动它也适用于 3.13。换句话说,代码从内核 3.2 到 3.13(已测试)编译和工作完美。我猜它也适用于最新的 linux 内核版本。

这里修改了完整的代码。

#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>
#include <linux/string.h>

static int len,temp;

static char *msg;
static char *dirname="driver/mydriver";
static char *dirname2="settings";
struct proc_dir_entry *subdirparent;
struct proc_dir_entry *parent;
struct proc_dir_entry *parent2;
static ssize_t read_proc(struct file *filp,char *buf,size_t count,loff_t *offp )
{
if(count>temp){count=temp;}
temp=temp-count;
copy_to_user(buf,msg, count);
if(count==0){temp=len;}

return count;
}

static ssize_t write_proc(struct file *filp,const char *buf,size_t count,loff_t *offp)
{
copy_from_user(msg,buf,count);
len=count;
temp=len;

return count;
}

struct file_operations proc_fops = {
read: read_proc,
write: write_proc
};

static void create_new_proc_entry(void)
{
parent = proc_mkdir(dirname, NULL);
parent2 = proc_mkdir(dirname2,parent);
proc_create("private_setting",0644,parent2,&proc_fops);
msg=kmalloc(GFP_KERNEL,10*sizeof(char));
}


static int proc_init (void)
{
create_new_proc_entry();
return 0;
}

static void proc_cleanup(void)
{
remove_proc_entry("private_setting",parent2);
remove_proc_entry(dirname2,parent);
remove_proc_entry(dirname,NULL);
}

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

这里是编译代码的 Makefile 示例。

obj-m := proc_rw_map2.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean

关于linux - 在 3.11 或更高版本的现有子目录下创建 Proc fs 目录和条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29700466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com