ubuntu/linux mint 创建proc文件的三种方法(一)

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试。

大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法。


方法一使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险)

方法二使用proc_create和seq_file创建proc文件(较方法三简洁)

方法三使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整)

示例四在proc文件中使用内核链表的一个示例(用的方法三)

--------------------------------------------------------------------------------------------------------------------

一、

proc_test01.c 源码

#include <linux/module.h>
#include <linux/sched.h> //jiffies
#include <linux/proc_fs.h>
#include <linux/uaccess.h> //copy_to|from_user()

static char *str = NULL;

//proc文件的读函数
static int my_proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
	int ret = 0;
	ret = sprintf(page, "current kernel time is %ld\n", jiffies);
	ret += sprintf(page+ret, "str is %s\n", str);

	return ret;
}

//proc文件的写函数
static int my_proc_write(struct file *filp, const char __user *buf, unsigned long count, void *data)
{
	//分配临时缓冲区
	char *tmp = kzalloc((count+1), GFP_KERNEL);
	if (!tmp)
		return -ENOMEM;

	//将用户态write的字符串拷贝到内核空间
	//copy_to|from_user(to,from,cnt)
	if (copy_from_user(tmp, buf, count)) {
		kfree(tmp);
		return -EFAULT;
	}

	//将str的旧空间释放,然后将tmp赋值给str
	kfree(str);
	str = tmp;

	return count;
}


static int __init my_init(void)
{
	struct proc_dir_entry *file;

	//创建proc文件
	file = create_proc_entry("jif", 0666, NULL);
	if (!file) {
		printk("Cannot create /proc/jif\n");
		return -1;
	}

	//将创建好的文件和读写函数关联在一起
	file->read_proc = my_proc_read;
	file->write_proc = my_proc_write;

	return 0;
}

static void __exit my_exit(void)
{
	//删除proc文件
	remove_proc_entry("jif", NULL);
	kfree(str);
}

module_init(my_init);
module_exit(my_exit);
MODULE_AUTHOR("aran");
MODULE_LICENSE("GPL");

Makefile文件:

obj-m	:= proc_test01.o
KERNEL	:= /lib/modules/`uname -r`/build #for mint/ubuntu
#KERNEL := /lib/modules/`uname -r`/source #for redhat

all:
	make -C $(KERNEL) M=`pwd` modules

install:
	make -C $(KERNEL) M=`pwd` modules_install
	depmod -A

clean:
	make -C $(KERNEL) M=`pwd` clean

测试结果:

    因为我用的是linxu mint 17, create_proc_entry()函数已被删除,故无法在本机上测试,但在redhat6.4上测试过,使用方法和测试截图请参考后面的方法。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux Mint 是一个基于 UbuntuLinux 发行版,它被设计成易于使用和用户友好的操作系统。它提供了一个类似于 Windows 的桌面环境,使得从 Windows 迁移到 Linux 的用户可以更加容易地上手。 Linux Mint Mac 是一种将 Linux Mint 安装在 Apple Macintosh 计算机上的操作系统。它利用了 Macintosh 计算机强大的硬件性能和优质的用户体验,并将其与 Linux Mint 的灵活性和安全性相结合。 Linux Mint Mac 具有与常规 Mac 操作系统相似的外观和感觉,包括顶部的菜单栏、Dock 等特色功能。用户可以在其中运行 Mac 上常见的应用程序,如 iTunes、iMovie 等。 除了提供与 Mac 操作系统类似的使用体验外,Linux Mint Mac 还提供了许多独有的功能和优势。首先,它是基于 Linux 的操作系统,具有出色的稳定性和安全性,可以免受病毒和恶意软件的影响。其次,Linux Mint Mac 提供了丰富的软件库和应用商店,用户可以方便地安装和更新软件。此外,Linux Mint Mac 还支持 Windows 软件的运行,用户可以通过 WINE 或者虚拟机在其上运行 Windows 程序。 总之,Linux Mint Mac 是一种在 Macintosh 计算机上安装 Linux Mint 操作系统的方法,它提供了与 Mac 操作系统类似的外观和用户体验,同时又具备 Linux Mint 的灵活性和安全性。无论是需要更高性能和更多自由度的用户,还是对安全性有更高要求的用户,Linux Mint Mac 都是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a_ran

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值