Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)
Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)
引入
1. 进程和APP通信
创建进程
读取、分发
- 进程发送输入事件给APP
- 进程读取APP回应的事件
输入系统涉及双向的进程间通信
2. 回顾Binder系统
Server-- 单向发出请求
Client -- 单向回复请求
每次请求只可以单方发出
3. 引入Socketpair
原因:如果创建两组进程(Client,Server)进行双向通信,实现十分复杂
引入Socketpair:
Socketpair();两次,获得两个fd,在内核获得缓冲区,一个作为sendbuf区一个作为receivebuf区
APP通过fd1将数据写入fd1的sendbuf区中,通过内核当中的socket机制就会写到fd2中receivebuf区,同理fd2也是如此
socketpair缺点:只适用于线程间、父子进程通信
解决方法:通过Binder机制通信可以访问任意进程,就解决了sockpair缺点(具体见输入系统(四))
4. socketpair具体使用
创建一个线程--pthread_create();
创建socketpair--socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);
线程处理函数--往socket[1]写入数据,读取socket[0]读取数据
主函数--从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)的更多相关文章
- Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c
Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...
- 10.2、android输入系统_必备Linux编程知识_双向通信(scoketpair)
2. 双向通信(socketpair) 输入系统肯定涉及进程通讯:进程A读取/分发输入事件,APP处理输入事件,进程A给APP发送输入事件,APP处理完事件回复信息给进程A,APP关闭的时候也要发信息 ...
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- Android系统--输入系统(五)输入系统框架
Android系统--输入系统(五)输入系统框架 1. Android设备使用场景: 假设一个Android平板,APP功能.系统功能(开机关机.调节音量).外接设备功能(键盘.触摸屏.USB外接键盘 ...
- Android系统--输入系统(九)Reader线程_核心类及配置文件
Android系统--输入系统(九)Reader线程_核心类及配置文件 1. Reader线程核心类--EventHub 1.1 Reader线程核心结构体 实例化对象:mEventHub--表示多个 ...
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(六)模拟输入驱动程序
Android系统--输入系统(六)模拟输入驱动程序 1. 回顾输入子系统 简单字符设备驱动:应用程序通过调用驱动所实现的函数使能硬件. 输入子系统:由于有多个应用程序使用输入子系统,故肯定使用的是早 ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...
随机推荐
- Openstack(Kilo)安装系列之环境准备(二)
控制节点.网络节点.计算节点: 一.配置源 1.配置EPEL源 yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-rel ...
- js yield
meikidd 发布在meikidd2015年5月6日view:3397 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. 隐藏标注 首先请原谅我的标题党(●—●),tj 大神的 ...
- 添加可点击的imagebottom,有个点击动画效果
android添加可点击的按钮,有个动画切换 ,首先定义一个 res/drawable中定义一个 btn_shutter_background.xml,其定义举例如下: <?xml versio ...
- Tomcat工作原理解析!
Tomcat简介 作者:杨晓(http://blog.sina.com.cn/u/1237288325) 一.Tomcat背景 自从JSP发布之后,推出了各式各样的JSP引擎.Apache Gro ...
- Spring 中的 Resource和ResourceLoader
Spring 内部框架使用org.springframework.core.io.Resource接口作为所有资源的抽象和访问接口.Resource接口可以根据资源的不同类型,或者资源所处的不同场合, ...
- python学习【第二篇】初识python
python的安装 windows 1.下载安装包 https://www.python.org/downloads/ 2.安装 默认安装路径:C:\python27 3.配置环境变量 [右键计算机] ...
- Win7系统安装 MySQL 5.7.23
1. 下载 MySQL 5.7版本:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 2. 解压到指定文件夹,mysql根目录下创建my ...
- 【BZOJ1930】[Shoi2003]pacman 吃豆豆 最大费用最大流
[BZOJ1930][Shoi2003]pacman 吃豆豆 Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会 ...
- EasyNVR智能云终端接入AI视频智能分析功能,用户可自定义接入自己的分析算法
视频分析的需求 人工智能的发展和在行业中的作用就不用多说了,已经到了势在必行的一个程度了,尤其是对于流媒体音视频行业来说,这基本上是人工智能重中之重的领域,视频人工智能,也就是视频视觉分析的应用方式大 ...
- 扩展类 HOW TO EXTEND CLASSES TO MAKE NEW CLASSES IN PYTHON
How to Extend Classes to Make New Classes in Python - dummies https://www.dummies.com/programming/py ...