proc文件

参考代码:

#include <linux/init.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/uaccess.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/seq_file.h>   

#include <asm/uaccess.h>  

#define STRING_LEN 1024  

char global_buffer[STRING_LEN] = {0};

static int my_proc_show(struct seq_file *seq, void *v)
{
    printk("my_proc_show called\n");
    seq_printf(seq, "current kernel time is %ld\n", jiffies);
    seq_printf(seq, "global_buffer: %s", global_buffer);

    return 0;
}

static int my_proc_open(struct inode *inode, struct file *file)
{
    return single_open(file, my_proc_show, inode->i_private);
} 

static ssize_t my_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos)
{
    if (count > 0) {
        printk("my_proc_write called\n");
        copy_from_user(global_buffer, buffer, count);
    }

    return count;
} 

struct file_operations proc_fops =
{
    .open  = my_proc_open,
    .read  = seq_read,
    .write  = my_proc_write,
    .llseek  = seq_lseek,
    .release = single_release,
};

static struct proc_dir_entry *proc_dir = NULL;
static struct proc_dir_entry *proc_file = NULL; 

static int __init proc_test_init(void)
{
    proc_dir = proc_mkdir("my_proc", NULL);
    if (!proc_dir) {
         printk(KERN_DEBUG"proc_mkdir failed");
         return 0;
    }

    proc_file = proc_create("buffer", 0666, proc_dir, &proc_fops);
    if (!proc_file) {
         printk(KERN_DEBUG"proc_create failed");
         return 0;
    }

    strcpy(global_buffer, "hello");
    return 0;
}  

static void __exit proc_test_exit(void)
{
    remove_proc_entry("buffer", proc_dir);
    remove_proc_entry("my_proc", NULL);
}  

module_init(proc_test_init);
module_exit(proc_test_exit);
MODULE_AUTHOR("derek.yi");
MODULE_LICENSE("GPL");  

/*
echo "Hello from kernel" > /proc/my_proc/buffer
cat /proc/my_proc/buffer
*/

测试:

[email protected]:~/share/ldd5$ cat /proc/my_proc/buffer
current kernel time is 4295327951
global_buffer: hello[email protected]:~/share/ldd5$ echo "Hello from kernel" > /proc/my_proc/buffer
[email protected]:~/share/ldd5$ cat /proc/my_proc/buffer
current kernel time is 4295330282
global_buffer: Hello from kernel
时间: 2025-01-02 14:11:48

proc文件的相关文章

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

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

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

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

《Linux/Unix系统编程手册》读书笔记7 (/proc文件的简介和运用)

<Linux/Unix系统编程手册>读书笔记 目录 第11章 这章主要讲了关于Linux和UNIX的系统资源的限制. 关于限制都存在一个最小值,这些最小值为<limits.h>文件中的常量. 通过cat 命令查看: [email protected]:~/Code/tlpi$ cat /usr/include/limits.h /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software

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

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

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

在做内核驱动开发的时候,可以使用/proc下的文件,获取相应的信息,以便调试. 大多数/proc下的文件是只读的,但为了示例的完整性,都提供了写方法. 方法一:使用create_proc_entry创建proc文件(简单,但写操作有缓冲区溢出的危险): 方法二:使用proc_create和seq_file创建proc文件(较方法三简洁): 方法三:使用proc_create_data和seq_file创建proc文件(较麻烦,但比较完整): 示例四:在proc文件中使用内核链表的一个示例(用的方

Linux 小知识翻译 - 「/proc 文件夹」

这次聊聊 「/proc 文件夹」. /proc 文件夹用来保管系统状态相关的文件的特殊文件夹,这个文件夹中有的文件只是内存上的虚拟文件. /proc 文件夹下有些文件可以反映各个进程的运行状态.所以说是决定Linux运行的非常重要的文件夹. 通过这个文件夹下文件,可以获取各式各样的信息.比如,请在命令行下输入「cat /proc/cpuinfo」试试看.可以获得CPU的信息. 其它还可以获得内存信息,驱动信息,以及其它软硬件方面的各种信息. 因此,修改 /proc 文件夹下的文件,可以调整系统的

linux伪文件与proc文件

linux/unix系统的文件类型大致可分为三类:普通文件.目录文件和伪文件.常见的伪文件分别是特殊文件.命名管道及proc文件. 伪文件不是用来存储数据的,因此这些文件不占用磁盘空间,尽管这些文件确实存在于目录树中,是目录树的一部分,并且也执照目录的方式来组织.伪文件的目的是提供一种服务,通过这种服务,系统可以像操作普通文件一样来访问这些文件对代表的对象.是重要的是伪文件是设备文件.如键盘.鼠标.显示器等.对于这些设备文件都有对应有伪文件来表示它们.除了设备之外,还有命名管道,通过命名管道,用

内核模块遍历进程和任务队列保存到proc文件中

实现一个模块用它遍历当前进程的父进程和任务队列,并将遍历的结果输出到一个proc 文件中(遍历可以从 current 当前进程开始,父进程遍历到初始化进程,遍历任务队列可以利用 for_each_process 宏). 下面是我的内核模块的实现部分: /************************************************************ * 使用内核模块从当前进程开始先前遍历,知道找到第一个进程为止 * * 并将遍历的结果保存到proc文件中 * ******

驱动加载到proc文件下

kernel的调试方法一般常用的有jtag  ,printk,proc,sys ,debugfile..   关于这些的对比准备专门写一个,这里就主要介绍proc的调试方法. /proc文件系统是一种特殊的,由软件创建的文件系统,内核使用它向外界导出信息. /proc下面的每个文件都绑定一个内核函数,用户读取其中的文件时,该函数动态的生成文件的"内容". 这样其实是给了我们一个函数的接口,在这个接口我们可以调用底层我们自己写的驱动函数,可以在其中加入自己想的打印什么的.有了这个接口我们

创建你的 /proc 文件

一旦你有一个定义好的 read_proc 函数, 你应当连接它到 /proc 层次中的一个入口项. 使用一个 creat_proc_read_entry 调用: struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data); 这里, name 是要创建的文件名子, mod 是文件