开发驱动,当你像操作文件一样操作设备时,你可能还需要在用户态和内核态交换数据,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) |