本文是学习android深度搜所作笔记

统计单词数的linux驱动

驱动代码:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <asm/uaccess.h>


//定义设备文件名
#define DEVICE_NAME "wordcount"
//保存向设备文件写入的数据
static unsigned char mem[10000];
//单词数
static int word_count = 0;
#define TRUE 255
#define FALSE 0


//检查字符是否为空格
static unsigned char is_spacewhite(char c)
{
if (c == 32 || c == 9 || c == 13 || c == 10)
return TRUE;
else
return FALSE;
}
//统计单词数
static int get_word_count(const char *buf)
{
int n = 1;
int i = 0;
char c = ' ';
char flag = 0; // 处理多个空格分隔的情况,0:正常情况,1:已遇到一个空格
if (*buf == '\0')
return 0;
// 第1个字符是空格,从0开始计数
if (is_spacewhite(*buf) == TRUE)
n--;


// 扫描字符串中的每一个字符
for (; (c = *(buf + i)) != '\0'; i++)
{
// 只由一个空格分隔单词的情况
if (flag == 1 && is_spacewhite(c) == FALSE)
{
flag = 0;
}
// 由多个空格分隔单词的情况,忽略多余的空格
else if (flag == 1 && is_spacewhite(c) == TRUE)
{
continue;
}
// 当前字符为空格是单词数加1
if (is_spacewhite(c) == TRUE)
{
n++;
flag = 1;
}
}
// 如果字符串以一个或多个空格结尾,不计数(单词数减1)
if (is_spacewhite(*(buf + i - 1)) == TRUE)
n--;
return n;
}
//从设备文件读取数据
//file:指向设备文件
//buf:保存可读取的数据
//count:可读取的字节数
//ppos:读取数据的偏移量
static ssize_t word_count_read(struct file *file,char __user *buf,size_t count,loff_t *ppos){
unsigned char temp[4];


temp[0] = word_count >> 24;
temp[1] = word_count >> 16;
temp[2] = word_count >> 8;
temp[3] = word_count;
if (copy_to_user(buf, (void*) temp, 4))
{
return -EINVAL;
}
printk("read:word count:%d", (int) count);
return count;
}
//向设备文件写入数据
//file:指向设备文件
//buf:保存写入的数据
//count:写入数据的字节数
//ppos:写入数据的偏移量
static ssize_t word_count_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos){
size_t written=count;
//将用户空间的数据,复制到内核空间
if(copy_from_user(mem,buf,count)){
return -EINVAL;
}
mem[count]="\0";
//统计单词个数
word_count=get_word_count(mem);
//输出已写入的字节数
printk("written count:%d",(int)word_count);
return written;
}

//描述与设备文件触发的事件对应的回设函数指针
//owner:设备事件回调函数应用于哪此驱动模块
//指定调用的函数
static struct file_operations dev_fops={
.owner= THIS_MODULE,
.read=word_count_read,
.write=word_count_write
};

//描述设备文件的信息
//minor:指定次设备号,此处是动态生成
//name:设备文件名称
static struct miscdevice misc={
.minor=MISC_DYNAMIC_MINOR,
.name=DEVICE_NAME,
.fops=&dev_fops
};


//初始化linux驱动
static int word_count_init(void){
int ret;
//建立设备文件
ret=misc_register(&misc);

//输出日志信息
printk("word_count_init_success\n");
return ret;
}
//退出linux驱动
static void word_count_exit(void){
misc_deregister(&misc);
printk("word_count_init_exit_sucess\n");
}
//注册初始化linux驱动的函数
module_init(word_count_init);
//注册退出linux驱动的函数
module_exit(word_count_exit);


MODULE_AUTHOR ("retacn_yue");
MODULE_DESCRIPTION("statistics of word count.");
MODULE_ALIAS("word count module.");
MODULE_LICENSE("GPL");

==================================linux环境下测试================================

makefile文件

ifneq ($(KERNELRELEASE),)
obj-m :=word_count.o
else
KERNELDIR=/usr/src/kernels/2.6.35.14-106.fc14.i686/
PWD :=$(shell pwd)
all:
make -C $(KERNELDIR) M=$(PWD)
clean:
rm -rf *.ko *.o *.mod.c *.mod.o *.symvers *.order
endif


编译:make

编译查看结果:(会生成以下文件)
[root@localhost word_count]# ls
Makefile Module.symvers word_count.ko word_count.mod.o
modules.order word_count.c word_count.mod.c word_count.o

安装ismod word_count.ko

查看lsmod | grep word_count

[root@localhost toolschain]# lsmod | grep word_count
word_count 11458 0

卸载rmmod word_count

[root@localhost toolschain]#rmmod word_count
word_count_init_exit_sucess
rmmod: module 'word_count' not found


linux上的测试代码:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>


int main(int argc,char *argv[]){
//打开设备文件的名柄
int testdev;
//表示单词数的四个字节
unsigned char buf[4];
//打开设备
testdev=open("/dev/wordcount",O_RDWR);
if(testdev==-1){
printf("cann't open this file! \n");
return 0;
}
//如果test_word_count后面跟有命令行参数,第一个参数将作为待统计字符串
//如果没有字符串,只读取设备文件中的值
if(argc>1){
//向设备文件写入待统计的字符串
write(testdev,argv[1] ,strlen(argv[1]));
//输出待统计的字符串
printf("string: %s\n",argv[1]);
}
//读取设备文件中的单词个数
read(testdev,buf,4);
int num=0;//单词数
//将四个字节还原成int类值
num=((int)buf[0])<<24|((int)buf[1])<<16|((int)buf[2])<<8|((int)buf[3]);
//输出四个字节的值
printf("word byte dispaly: %d %d %d %d\n",buf[0],buf[1],buf[2],buf[3]);
//输出单词个数
printf("word count: %d\n",num);
//关闭设备文件
close(testdev);
return 0;

}

更多相关文章

  1. linux 配置安装android sdk自动下载缺少文件
  2. Android在MTP模式下,只显示指定文件夹
  3. android 使用html5作布局文件: webview跟javascript交互
  4. Android - Manifest 文件 详解
  5. android 下写文件性能测试
  6. Android 命令行编译、打包生成apk文件
  7. Android Studio & ADT 快捷键配置文件所在目录,自定义后可导入导
  8. Android实现下载文件功能的方法

随机推荐

  1. XML卷之实战锦囊(5):结构树图
  2. Android(安卓)Wifi模块学习
  3. Android(安卓)机器人遇见龙
  4. android pull 解析xml方式
  5. java使用xpath和dom4j解析xml
  6. 初学opencv(一)
  7. java使用jaxb操作xml示例
  8. php操作xml入门之cdata区段
  9. Android(安卓)通过蓝牙控制小车源代码+视
  10. java读取解析xml文件实例