Android很多地方会涉及到进程间的通信,比如输入系统,那么进程间通信会涉及哪些内容呢?

1、进程:负责读取和分发事件
2、应用程序:负责处理输入事件
上面这两个进程会涉及哪些双向通信呢:
1.进程会发送输入事件
2.应用程序会告知事件处理完或APP已关闭
这里大家可能会有疑惑,binder系统能否实现上面所说的双向通信呢?
答案是不行,binder分为server和client,每次都由client主动发出请求,server收到请求后进行答复,这样的缺点就是每次请求只能单方发起,server不能主动发送数据给client,这样自然不能称为双向通信。
所以这里引入一个新的方法,叫“socketpair”
APP通过socketpair调用得到两个文件句柄,假设这两个文件句柄是fd1和fd2,这两个文件都对应有两个缓冲区(send_buf、rcv_buf),当某个进程或线程通过fd1写到他的send_buf的时候,内核里面的socket就会把send_buf里面的数据写到fd2的rcv_buf里面,另外一个线程或进程就可以读取fd2得到那些数据了,相反同理。
但是它也有缺点:由于是通过创建文件句柄来访问句柄实现的通信,那么谁可以看到这个句柄呢,只有当前APP创建出来的线程或它创建出来的子进程才能看到这些文件句柄,所以只适用于线程间通信,或者具有亲缘关系(父子进程)的进程间通信。
那么如果想使用socketpair来实现任意间的进程间的双向通信怎么办?
假设现在有APP1和APP2,这两个APP想进行任意间的进程通信,那么APP2需要得到APP1的fd2才行,怎么得到呢?可以通过binder通信,把fd2传给APP2,当然在APP2里面它就变为fd3了,这样这个任意的进程APP2就可以通过socketpair来进行通信了。这篇暂不讲解binder的实现方式
下面讲解一下“Socketpair”的程序及使用:
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#define SOCKET_BUFFER_SIZE (32768U)
/* 参考:
* frameworks\native\libs\input\InputTransport.cpp
*/
/* 线程1函数实现 */
void *function_thread1 (void *arg)
{
int fd = (int)arg;/* 把文件句柄转换出来 */
char buf[500];
int len;
int cnt = 0;
while (1)
{
/* 向 main线程发出: Hello, main thread */
len = sprintf(buf, "Hello, main thread, cnt = %d", cnt++);
write(fd, buf, len);
/* 读取数据(main线程发回的数据) */
len = read(fd, buf, 500);
buf[len] = '\0';
printf("%s\n", buf);
/* 延时5秒钟 */
sleep(5);
}
return NULL;
}
int main(int argc, char **argv)
{
int sockets[2];
/* 使用 socketpair 得到两个文件句柄到数组sockets */
socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);
/* 设置缓冲区, 每个文件句柄对应两个缓冲区,两个文件对应四个 */
int bufferSize = SOCKET_BUFFER_SIZE;
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));
/* 创建线程1(thread1),并把文件句柄sockets[1]传给子线程thread1 */
pthread_t threadID;
pthread_create(&threadID, NULL, function_thread1, (void *)sockets[1]);
char buf[500];
int len;
int cnt = 0;
int fd = sockets[0];/* 当前main函数的文件句柄是sockets[0] */
while(1)
{
/* 读数据: 读线程1发出的数据 */
len = read(fd, buf, 500);
buf[len] = '\0';
printf("%s\n", buf);
/* main thread向thread1 发出: Hello, thread1 */
len = sprintf(buf, "Hello, thread1, cnt = %d", cnt++);
write(fd, buf, len);
}
}
程序非常简单,先是使用socketpair得到两个文件句柄并设置发送接收缓冲区,然后创建另一个线程,在线程中通过文件句柄读写数据到main线程中,mian也执行同样的操作实现双向通信。
测试验证:
检查是否存在这两个线程:
我们还可以修改程序,让应用程序fork出一个子进程,然后让父子进程通过socketpair来实现双向通信,比较简单,这里就不细讲了。
由于socekpair只适用于线程间通信,或者具有亲缘关系,如果想实现任意的两个进程间的双向通信就需要使用binder系统把fd传给另一个进程,这里简单说下过程,如下:
使用binder传输文件句柄:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# socketpair
# 双向通信
# Android 通过Messager与Service实现进程间双向通信案例详解
# Android Messenger实现进程间双向通信
# Android基于Aidl的跨进程间双向通信管理中心
# Android Socket 线程连接openwrt与arduino单片机串口双向通信的实例解析
# Android binder 匿名服务实现双向通信的解决方案
# 句柄
# 这两个
# 可以通过
# 应用程序
# 适用于
# 写到
# 来实现
# 就可以
# 会有
# 还可以
# 就不
# 可以看到
# 另外一个
# 会把
# 这篇
# 才行
# 涉及到
# 它就
# 讲了
# 它也
相关文章:
建站之家VIP精选网站模板与SEO优化教程整合指南
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
定制建站方案优化指南:企业官网开发与建站费用解析
香港服务器建站指南:免备案优势与SEO优化技巧全解析
如何做网站制作流程,*游戏网站怎么搭建?
c++ stringstream用法详解_c++字符串与数字转换利器
建站DNS解析失败?如何正确配置域名服务器?
Android自定义控件实现温度旋转按钮效果
哈尔滨网站建设策划,哈尔滨电工证查询网站?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何选择高效稳定的ISP建站解决方案?
如何在建站之星网店版论坛获取技术支持?
如何在Ubuntu系统下快速搭建WordPress个人网站?
Swift开发中switch语句值绑定模式
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
如何快速查询网址的建站时间与历史轨迹?
视频网站制作教程,怎么样制作优酷网的小视频?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
如何在景安云服务器上绑定域名并配置虚拟主机?
如何通过老薛主机一键快速建站?
招商网站制作流程,网站招商广告语?
建站之星价格显示格式升级,你的预算足够吗?
制作农业网站的软件,比较好的农业网站推荐一下?
如何选择美橙互联多站合一建站方案?
C++如何使用std::optional?(处理可选值)
已有域名如何快速搭建专属网站?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
Thinkphp 中 distinct 的用法解析
青浦网站制作公司有哪些,苹果官网发货地是哪里?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何快速搭建高效简练网站?
如何安全更换建站之星模板并保留数据?
深入理解Android中的xmlns:tools属性
孙琪峥织梦建站教程如何优化数据库安全?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
制作网站公司那家好,网络公司是做什么的?
css网站制作参考文献有哪些,易聊怎么注册?
深圳网站制作的公司有哪些,dido官方网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
建站之星代理如何获取技术支持?
网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
建站之星如何开启自定义404页面避免用户流失?
小建面朝正北,A点实际方位是否存在偏差?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
盘锦网站制作公司,盘锦大洼有多少5G网站?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
制作网站的基本流程,设计网站的软件是什么?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
*请认真填写需求信息,我们会在24小时内与您取得联系。