Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)

引入

1. 进程和APP通信

  • 创建进程

  • 读取、分发

    - 进程发送输入事件给APP
    • 进程读取APP回应的事件
  • 输入系统涉及双向的进程间通信

2. 回顾Binder系统

  • Server-- 单向发出请求

  • Client -- 单向回复请求

  • 每次请求只可以单方发出

3. 引入Socketpair

  • 原因:如果创建两组进程(Client,Server)进行双向通信,实现十分复杂

  • 引入Socketpair:

  1. Socketpair();两次,获得两个fd,在内核获得缓冲区,一个作为sendbuf区一个作为receivebuf区

  2. APP通过fd1将数据写入fd1的sendbuf区中,通过内核当中的socket机制就会写到fd2中receivebuf区,同理fd2也是如此

  • socketpair缺点:只适用于线程间、父子进程通信

  • 解决方法:通过Binder机制通信可以访问任意进程,就解决了sockpair缺点(具体见输入系统(四))

4. socketpair具体使用

  1. 创建一个线程--pthread_create();

  2. 创建socketpair--socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);

  3. 线程处理函数--往socket[1]写入数据,读取socket[0]读取数据

  4. 主函数--从socket[1]读取数据,往socket[0]写入数据

实现代码:

#include <pthread.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #define SOCKET_BUFFER_SIZE (32768U) #define MAX 512 /* 参考: * frameworks\native\libs\input\InputTransport.cpp */ /* 线程执行函数 */ int *function_thread(void *arg) { int thread1_fd = (int)arg; int cnt=0; int len; char buf[MAX]; while(1){ /* 向 main线程发出: Hello, main thread */ len = sprintf(buf,"Hello , main thread , cnt = %d",cnt++); write(thread1_fd,buf,len); /* 读取数据(main线程发回的数据) */ len = read(thread1_fd,buf,MAX); buf[len] = '\0'; printf("thread1 read : %s\n",buf); sleep(5); } close(thread1_fd); return NULL; } int main(int argc,char *argv[]) { pthread_t threadID; int sockets[2]; int bufferSize = SOCKET_BUFFER_SIZE; socketpair(AF_UNIX,SOCK_SEQPACKET,0,sockets); //创建socketpair //初始化 setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize)); setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize)); pthread_create(threadID,NULL,function_thread,(void *)sockets[1]); //创建线程 int mainThread_fd = sockets[0]; int cnt=0; int len; char buf[MAX]; while(1){ /* 读数据: 线程1发出的数据 */ len = read(mainThread_fd,buf,MAX); buf[len] = '\0'; printf("main thread read : %s\n",buf); /* main thread向thread1 发出: Hello, thread1 */ len = sprintf(buf,"Hello , thread1 , cnt = %d",cnt++); write(mainThread_fd,buf,len); } close(mainThread_fd); return 0; }
使用方法:
  • gcc socketpair.c -o socketpair -pthread 注:出现少量警告,可以忽略

  • ./socketpair

Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)的更多相关文章

  1. Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c

    Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...

  2. 10.2、android输入系统_必备Linux编程知识_双向通信(scoketpair)

    2. 双向通信(socketpair) 输入系统肯定涉及进程通讯:进程A读取/分发输入事件,APP处理输入事件,进程A给APP发送输入事件,APP处理完事件回复信息给进程A,APP关闭的时候也要发信息 ...

  3. Android系统--输入系统(一)必备的Linux知识_inotify和epoll

    Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...

  4. Android系统--输入系统(五)输入系统框架

    Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...

  5. Android系统--输入系统(九)Reader线程_核心类及配置文件

    Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...

  6. Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析

    Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...

  7. Android系统--输入系统(六)模拟输入驱动程序

    Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...

  8. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  9. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件

    Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...

随机推荐

  1. Gmail 邮件配置备忘

    1.smtp端口号不是默认的25,smtp的是587 2.必须设置“允许使用不够安全的应用” 其他的按照网上文档设置就好了

  2. poj 1515+poj 1438(边双连通)

    题目链接:http://poj.org/problem?id=1515 思路:题目的意思是说将一个无向图改成有向图,使其成为强连通,输出所有的边.我们可以求无向图的边双连通分量,对于同一个双连通分量, ...

  3. 转:python 多线程就这么简单

    多线程 科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的:于是,操作系统就进入了多任务时代.我们听着音乐吃着火锅的不在是梦想. py ...

  4. jmeter 响应数据更换显示类型(json、html、text)

    .默认情况下是Text格式 2.修改为json格式显示

  5. js原型对象中属性被覆盖(1)

    /**   *@author 程无衣   *@description 关于在原型对象中属性被覆盖   */       function Person(){}       Person.prototy ...

  6. POJ1182食物链(并查集经典好题)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/E 题目思路:主要有两种思路:1.带权并查集2.挑战程 ...

  7. 洛谷P1122 最大子树和

    P1122 最大子树和 题目提供者该用户不存在 标签动态规划树形结构 难度普及/提高- 通过/提交54/100 提交该题 讨论 题解 记录 题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在 ...

  8. vs报错找不到错在哪里!Validation failed for one or more entities

    今天在处理Entity Framework修改数据库时,报错: Validation failed for one or more entities. See 'EntityValidationErr ...

  9. 1718 Cos的多项式

    1718 Cos的多项式 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 小明对三角函数充满了兴趣,有一天他突然发现一个神奇的性质. 2cos(nx)似乎可以表示成 ...

  10. ZOJ 2059 The Twin Towers(双塔DP)

    The Twin Towers Time Limit: 2 Seconds      Memory Limit: 65536 KB Twin towers we see you standing ta ...