proc编程的一个简单例子

本文介绍了一个利用Proc文件系统显示应用程序版本信息的方法。通过创建Proc文件并在驱动模块中实现读写功能,应用程序可以方便地更新和读取版本信息。文中提供了一个简单的示例代码,展示了如何在Proc文件中写入和读取数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近一直在考虑如何在只读文件系统中显示应用程序的版本号其他信息,由于用打印的方式的话会使串口显示的信息太多。最后想到使用proc文件系统来实现,在proc文件系统中建立一个文件,把在proc文件系统中建立文件并读写的功能写到一个驱动模块中,在应用程序中通过调用驱动接口的方式来把信息写入模块中,在操作proc中文件时输出此信息,这样想知道应用程序的版本号等信息就可直接打开对应的文件即可。当然还可以向proc中生成的文件写入信息。
    在网络上找到一个简单的例子,在这里借花献佛,希望能给需要的人一点帮助。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h>

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Fortune Cookie Kernel Module");
MODULE_AUTHOR("M. Tim Jones");

#define MAX_COOKIE_LENGTH       PAGE_SIZE

static struct proc_dir_entry *proc_entry;
static char *cookie_pot;  // Space for fortune strings
static int cookie_index;  // Index to write next fortune
static int next_fortune;  // Index to read next fortune

ssize_t fortune_write( struct file *filp, const char __user *buff,
                        unsigned long len, void *data )
{
  int space_available = (MAX_COOKIE_LENGTH-cookie_index)+1;
  if (len > space_available) {
    printk(KERN_INFO "fortune: cookie pot is full!/n");
    return -ENOSPC;
  }
  if (copy_from_user( &cookie_pot[cookie_index], buff, len )) {
    return -EFAULT;
  }
  printk("write len = %d/n", len);
  cookie_index += len;
  cookie_pot[cookie_index-1] = 0;
  return len;
}

int fortune_read( char *page, char **start, off_t off,
                   int count, int *eof, void *data )
{
  int len;
  if (off > 0) {
    *eof = 1;
    return 0;
  }
  /* Wrap-around */
  if (next_fortune >= cookie_index) next_fortune = 0;
  len = sprintf(page, "%s/n", &cookie_pot[next_fortune]);
  next_fortune += len;
  // len = sprintf(page, "%s/n", "20090210  V1.0.0");
  return len;
}

int init_fortune_module( void )
{
  int ret = 0;
  cookie_pot = (char *)vmalloc( MAX_COOKIE_LENGTH );
  if (!cookie_pot) {
    ret = -ENOMEM;
  } else {
    memset( cookie_pot, 0, MAX_COOKIE_LENGTH );
    proc_entry = create_proc_entry( "fortune", 0644, NULL );
    if (proc_entry == NULL) {
      ret = -ENOMEM;
      vfree(cookie_pot);
      printk(KERN_INFO "fortune: Couldn't create proc entry/n");
    } else {
      cookie_index = 0;
      next_fortune = 0;
      proc_entry->read_proc = fortune_read;
      proc_entry->write_proc = fortune_write;
      proc_entry->owner = THIS_MODULE;
      printk(KERN_INFO "fortune: Module loaded./n");
    }
  }
  return ret;
}
void cleanup_fortune_module( void )
{
  remove_proc_entry("fortune", &proc_root);
  vfree(cookie_pot);
  printk(KERN_INFO "fortune: Module unloaded./n");
}
module_init( init_fortune_module );
module_exit( cleanup_fortune_module );

Makefile如下:
LINUXROOT := /usr/src/kernels/2.6.11-1.1369_FC4-i686 //此处根据不同系统要修改
obj-m += proc_test_other.o
all:
        @make -C $(LINUXROOT) M=$(PWD) modules

clean:
        @make -C $(LINUXROOT) M=$(PWD) clean
   这个例子虽然简单但很实用,重要的是通过它可以更好更快的理解proc文件系统的编程来实现自已的目的。也可以把代码放到另一个驱动模块中,这样就可以实现和驱动的交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值