Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3433067
  • 博文数量: 754
  • 博客积分: 10132
  • 博客等级: 上将
  • 技术积分: 7780
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-14 23:36
文章分类

全部博文(754)

文章存档

2012年(3)

2011年(39)

2010年(66)

2009年(167)

2008年(479)

我的朋友

分类: LINUX

2009-01-21 08:45:41

开发驱动,当你像操作文件一样操作设备时,你可能还需要在用户态和内核态交换数据,proc文件系统提供这样的机制。
实例代码:
<>
#include
#include
#include
#include
#include
static struct proc_dir_entry *proc_entry ;
static unsigned long val=0x12345678 ;
ssize_t simple_proc_read(char *page,char **start,off_t off,\
 int count,int *eof,void *data)
{
  int len ;
  if(off>0){//don't visit offset .
 *eof=1 ;
 return 0 ;
  }
  len=sprintf(page,"%08lx\n",val) ;
  return len ;
}
ssize_t simple_proc_write(struct file *filp,const char __user *buff,\
 unsigned long len,void *data)
{
  #define MAX_UL_LEN 8
  char k_buf[MAX_UL_LEN] ;
  char *endp ;
  unsigned long new ;
  int count=min((unsigned long)MAX_UL_LEN,len) ;
  int ret ;
  if(copy_from_user(k_buf,buff,count)){
  ret=-EFAULT ;
 goto err ;
  }else{
 new=simple_strtoul(k_buf,&endp,16) ;
 if(k_buf==endp){
  ret=-EFAULT ;
  goto err ;
 }
 val=new ;
 return count ;
  }
  err:
 return ret ;
}
int __init simple_proc_init(void)
{
  proc_entry=create_proc_entry("sim_proc",0666,NULL) ;
  if(proc_entry==NULL)
  {
 printk(KERN_INFO"Couldn't create proc entry\n") ;
 goto err ;
  }else{
 proc_entry->read_proc=simple_proc_read ;
 proc_entry->write_proc=simple_proc_write ;
 proc_entry->owner=THIS_MODULE ;
  }
  return 0 ;
  err:
 return -ENOMEM ;
}
void __exit simple_proc_exit(void)
{
  remove_proc_entry("sim_proc",&proc_root) ;
}
module_init(simple_proc_init) ;
module_exit(simple_proc_exit) ;
测试代码:
<>
#include
main()
{
  char *file="/proc/sim_proc" ;
  char str1[]="87654321" ;
  char str2[9]="\0" ;
  FILE *fp=fopen(file,"w") ;
  int len=strlen(str1) ;
  int ret=0 ;
  if(fp==NULL)return ;
  fwrite(str1,sizeof(char),len,fp) ;
  fseek(fp,0,SEEK_SET) ;
  fclose(fp) ;
  fopen(file,"r") ;
  ret=fread(str2,sizeof(char),len,fp) ;
  printf("str:%s,ret:%d\n",str2,ret) ;
  fclose(fp) ;
}
 
Makefile文件:
<>
KER_DIR=/usr/src/kernels/linux-2.6.15.5

obj-m+=proc_sim.o

all:test
	$(MAKE) -C $(KER_DIR) M=$(PWD) modules	
test:test.o

clean:
	rm *.mod.c *.mod.o *.o *.ko .*.cmd test -rf

 
阅读(882) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~