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
转载于:https://www.cnblogs.com/lkq1220/p/6440095.html
Android系统--输入系统(三)必备Linux知识_双向通信(scoketpair)相关推荐
- Android系统--输入系统(一)必备的Linux知识_inotify和epoll
Android系统--输入系统(一)必备的Linux知识_inotify和epoll 引入 1. 笔记本电脑插入外接键盘,两个键盘都可以使用 a. 键盘即插即用--如何检测键盘的接入和拔出 hotpl ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- Android Input 输入系统学习
原文在https://blog.csdn.net/kehyuanyu/article/details/48573211 Android输入设备的映射 使用指令dumpsys input 可以看到以下信 ...
- Android输入系统IMS(1)--基础知识epoll和notify
做Android系统三年多,量产项目也有3~4个了,却从来没写过相关博客,最近换工作到新东家报道前这段时间比较闲写写博客总结一下这些年对Android系统的了解.先挑个相对简单的ims下手. epol ...
- Android | 输入系统(IMS)
前言 一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEv ...
- 软件测试从业者,Linux知识从入门到玩转(必读)
好久没用"必读"这两个字了,毕竟没啥内容是所有人都得必读的(当然,测试君这里也只是用了"入门到玩转","精通"可不敢乱用 . 行业新人特别喜 ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之输入系统应用编程
文章目录 前言 1.输入系统应用编程 1.1.输入系统框架及调试 1.1.1.框架概述 1.1.2.编写APP需要的基础知识 1.2.调试技巧 1.2.1.查看设备信息 1.2.2.使用命令查看节点数 ...
- android 输入法框架,Android输入系统(2)——输入系统框架(Android+Linux)
1.优秀文档 android输入系统官方文档:http://source.android.com/devices/input/index.html 中文官方文档 <深入理解Android 卷II ...
- Android输入系统(三)InputReader的加工类型和InputDispatcher的分发过程
关联系列 解析WMS系列 深入理解JNI系列 输入系统系列 前言 在上一篇文章中,我们学习了输入事件的处理,输入事件会交由InputDispatcher进行分发,那么InputDispatcher是如 ...
- Android输入系统(三)——InputReader的加工类型和InputDispatcher的分发过程(基于Android 13)
1 InputReader的加工类型 InputReader具有多种加工类型,由上面的InputReader的执行流程可知,对于按键事件,InputReader会将按键信息封装成NotifyKeyAr ...
最新文章
- python爬虫赚钱的途径-如何用爬虫技术赚钱?
- spring boot 集成 mybatis,数据库为mysql
- php fpm.conf 注释,使用sed处理php-fpm.conf和nginx.conf文本里的注释信息
- .+filename的作用
- SQL笛卡尔积结合前后行数据的统计案例
- python矩阵对角化_numpy创建单位矩阵和对角矩阵的实例
- libjpeg学习3:turbojpeg试用
- Eclipse中的Git使用之Branch创建,Merge
- 端口占用问题解决办法(以1099端口为例)
- 对列 、生产者与消费者
- Win11怎么卸载软件?Win11彻底卸载软件教程
- STM32F103 485通信开发实例(三):与触摸屏通过Modbus进行通信
- 百度信誉认证体系初级实名认证即将取消,这意味着什么?
- 用c#实现简单的登录和注册功能
- matlab svc doc,TCR+FC型SVC的研究及MATLAB仿真.doc
- 千粉缔造760w播放!B站“新人”UP主在B站怎么加速上位?
- 极值点、驻点、鞍点、拐点
- 黑苹果html5,黑苹果配置必备神器 Clover Configurator v5.10.0.0 官方中文原版
- 智源社区AI周刊No.105:谷歌FLAN-T5 30亿参数即超越GPT-3性能;Copilot推出语音编程新功能,但面临诉讼...
- 找圆算法((HoughCircles)总结与优化
热门文章
- 里氏替换原则_趣谈设计模式之里氏替代原则
- Scala简介、安装、函数、面向对象
- org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.demo.pojo.IdCard
- Apache构建虚拟web主机
- MyBatis3教程
- [.NET] 《Effective C#》快速笔记(四)- 使用框架
- Quartus II 与ModelSim-Altera联合仿真PLL
- 乘坐飞机时,有什么事情是机长和机上工作人员不想让乘客知道的?
- VDI序曲十一 微软桌面虚拟化之授权服务器
- spark读取kafka数据 createStream和createDirectStream的区别