By 高焕堂 2011/09/09
[ IT史上最完整、最经典的软件框架开发技术宝典 (上百篇经典文章&eBooks) ]
[Go Back]
天字第一号框架模式与Android/Linux 驱动开发
5. 撰写Client应用程序(App)
5.1 撰写app应用程序代码
此应用程序代码如下:
/* app应用程序 */
#include <stdio.h>
#include <fcntl.h>
#define DEVFILE "/dev/androidin"
#define BUFLEN 128
int main() {
int fd = 0;
int in[2] = {134, 2567};
int out = 0;
fd = open(DEVFILE, O_RDWR);
if(fd == 0)
printf("open '/dev/add' failed!\n");
printf("fd:%d\n", fd);
write(fd, in, sizeof(in));
read(fd, &out, sizeof(out));
close(fd);
printf("Input:%d %d\n", in[0], in[1]);
printf("Output:%d\n", out);
return 0;
}
5.2 app透过system call呼叫add_open()函数
执行到app应用程序里的指令:
fd = open(DEVFILE, O_RDWR);
此时,呼叫到add_open()函数,执行其内含的指令:
filp->private_data = &adder;
adder.common = filp;
建立了两个对象的密切关系。

图13、体现类别继承的对象间关系
这两个对象间的结构,实际支撑了file与add_file两个类别之间的继承关系。此时,轮胎(即adder对象)已经装配完成了。 接着,继续执行到app应用程序代码:
write(fd, in, sizeof(in));
// ……..
就呼叫到add_file类别的add_write()函数,执行此函数内含的指令:
retval = copy_from_user(data, buf, count);
将app里的数据(存于buf内)考贝到add_file对象内的data变量里。接着,继续执行到app应用程序代码:
read(fd, &out, sizeof(out));
就呼叫到add_file类别的add_read()函数,执行此函数内含的指令:
int sum = data[0] + data[1];
//……….
retval = copy_to_user(buf, &sum, sizeof(int));
先进行加法运算,结果存于sum变量里。再将sum里的值考贝到app应用程序的buf里。最后,继续执行到app应用程序代码:
printf("Input:%d %d\n", in[0], in[1]);
printf("Output:%d\n", out);
就将加法计算的结果打印出来了。
[Go Back]