在/proc文件系统中添加和删除文件

在Linux-2.6.18内核中编写一个内核模块,其功能是在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world。

代码附录在博文的末尾

1. 在/目录中新建一个目录test,在test目录中新建一个目录proc_t,用于编写内核模块

cd /
mkdir test
cd test
mkdir proc_t
cd proc_t
在/proc文件系统中添加和删除文件_第1张图片

2. 在proc_t目录中,新建文件proc.c和Makefile

注:Makefile的大小写不能错,如果写成makefile、MakeFile、makeFile等,则不行。

请参考以下教程进行新建(如何使用vim命令修改或新建文件):点击打开链接

http://blog.csdn.net/softimite_zifeng/article/details/53303856

2.1. 新建proc.c

vim proc.c
在/proc文件系统中添加和删除文件_第2张图片

2.2. 新建Makefile

vim Makefile
在/proc文件系统中添加和删除文件_第3张图片

2.3. 查看proc_t目录下的文件

ls

3. 编译模块

make
4. 载入模块

insmod proc.ko
5. 在/proc文件系统中查看

cd /proc
ls
cd hello
ls
cat world
在/proc文件系统中添加和删除文件_第4张图片

6. 卸载模块

rmmod proc
7. 清除编译结果

make clean


实验运行流程:

1. 跳转至/proc文件下,查看已有文件,此时没有名为hello的目录。

在/proc文件系统中添加和删除文件_第5张图片

2. 跳转至/test/proc_t文件下,编译并载入模块。

在/proc文件系统中添加和删除文件_第6张图片

3. 跳转至/proc文件下,查看文件信息。我们发现在/proc文件下,存在一个名为hello的目录,hello目录下存在一个名为world的文件,文件内容为hello world。

在/proc文件系统中添加和删除文件_第7张图片

4. 跳转至/test/proc_t文件下,卸载模块并清理。

在/proc文件系统中添加和删除文件_第8张图片

5. 跳转至/proc文件下,查看文件信息,此时hello目录已被删除

在/proc文件系统中添加和删除文件_第9张图片


代码:

1. proc.c

#include 
#include 
#include 
#include 

#define dir_name "hello"
#define file_name "world"

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kook Bae");
MODULE_DESCRIPTION("a proc_test module");

static struct proc_dir_entry *dir;
static struct proc_dir_entry *file;

int file_read(char *buf,char **start,off_t off,int count,int *eof,void *data)
{
	int ret;
	ret=sprintf(buf,"hello world\n");
	return(ret);
}

static int __init proc_init(void)
{
	dir = proc_mkdir(dir_name,NULL);
	if(dir==NULL)
	{
		remove_proc_entry(dir_name,NULL);
		printk(KERN_ALERT "Create direction hello :Failed!\n");
		return(-1);
	}
	printk(KERN_ALERT "Create direction hello :Success!\n");
	file = create_proc_entry(file_name,0644,dir);
	if(file==NULL)
	{
		remove_proc_entry(file_name,dir);
		printk(KERN_ALERT "Create file world :Failed!\n");
		return(-1);
	}
	
	file->read_proc = file_read;
	file->uid=0;
	file->gid=0;
	file->size=36;
	
	printk(KERN_ALERT "Create file world :Success!\n");
	return(0);
}

static void __exit proc_exit(void)
{
	remove_proc_entry(file_name,dir);
	remove_proc_entry(dir_name,NULL);
	printk(KERN_ALERT "Delete direction hello and file world :Success!\n");
}

module_init(proc_init);
module_exit(proc_exit);

2. Makefile

obj-m := proc.o

KDIR := /lib/modules/2.6.18/build/
PWD := $(shell pwd)

all:
make -C $(KDIR) M=$(PWD) modules

clean:
make -C $(KDIR) M=$(PWD) clean
rm -rf *.ko *.mod.c *.o Module.* *.c~ Makefile~

你可能感兴趣的:(教程)