当前位置: 首页 > news >正文

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录

  • Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用()
    • 1.概念
    • 2.流程
    • 3.bctest.c
      • 3.1 注册服务,打开binder驱动
      • 3.2 获取服务
    • 4.binder_call

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用()

1.概念

IPC,进程间通信,a进程发送数据给b进程,就是跨进程通信。

RPC,远程调用,a进程想打开led,点亮led,调用led_open函数,通过IPC发送数据给b进程,b取出数据,然后调用b进程的led_open函数,看似a进程来直接操作led_open函数一样,实际上是a发送数据给b,b操作硬件

b进程服务端程序要先向servicemanager注册服务,a进程查询led_服务,得到一个handle,指向进程b。

数据一般存在char buf[1024]里面。a,b进程通过buffer传递数据双端。

谷歌的源码参考目录

在这里插入图片描述

binder.c(谷歌封装好的c函数)

2.流程

servicemanager先由系统先运行,

  1. open binder驱动
  2. 告诉驱动程序自己就是servicemanager
  3. while(1)循环,读数据,读取驱动,获取数据,没有数据就休眠,得到数据就解析数据。
    • 服务端注册服务,在链表中记录服务名,
    • 客户端获取服务,查询链表中的服务,返回服务端进程

服务端程序:

  1. open驱动
  2. 注册服务,向servicemanager发送服务的名字,
  3. while(1)读驱动,无数据就休眠,解析数据,调用系统对应的底层函数,

客户端程序:

  1. open驱动。
  2. 获取服务,向servicemanager查询服务,获得一个handle,
  3. 向handle句柄发送数据。

打开驱动程序

在这里插入图片描述

告诉驱动程序自己就是servicemanager

在这里插入图片描述

循环读取数据,

在这里插入图片描述

binder_loop读数据,

在这里插入图片描述

解析数据

在这里插入图片描述

处理回复信息给客户端

在这里插入图片描述

客户端获取服务

在这里插入图片描述

注册服务

在这里插入图片描述

3.bctest.c

3.1 注册服务,打开binder驱动

在这里插入图片描述

注册服务,构造好数据

在这里插入图片描述

发给目标target

在这里插入图片描述

我们看一下这个值

在这里插入图片描述

在头文件中定义,句柄是0,进程间通信,0就是servicemanager进程,

在这里插入图片描述

通过binder_call调用,code: 表示要调用servicemanager中的"addservice"函数

3.2 获取服务

打开驱动, 循环查询服务列表

在这里插入图片描述

if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))
return 0;

还是调用binder_call函数,msg中含有你想获取服务的名字,含有servicemanager回复的数据,

4.binder_call

实现远程调用, 向谁发数据,

target,目的进程

code,调用的函数

msg,提供的数据参数

reply,返回值

构造我们要发送的数据,放在buffer中,用binder_io

调用ioctl发送数据。

int binder_call(struct binder_state *bs,struct binder_io *msg, struct binder_io *reply,uint32_t target, uint32_t code)
{int res;struct binder_write_read bwr;struct {uint32_t cmd;struct binder_transaction_data txn;} __attribute__((packed)) writebuf;unsigned readbuf[32];if (msg->flags & BIO_F_OVERFLOW) {fprintf(stderr,"binder: txn buffer overflow\n");goto fail;}writebuf.cmd = BC_TRANSACTION;writebuf.txn.target.handle = target;writebuf.txn.code = code;writebuf.txn.flags = 0;writebuf.txn.data_size = msg->data - msg->data0;writebuf.txn.offsets_size = ((char*) msg->offs) - ((char*) msg->offs0);writebuf.txn.data.ptr.buffer = (uintptr_t)msg->data0;writebuf.txn.data.ptr.offsets = (uintptr_t)msg->offs0;bwr.write_size = sizeof(writebuf);bwr.write_consumed = 0;bwr.write_buffer = (uintptr_t) &writebuf;hexdump(msg->data0, msg->data - msg->data0);for (;;) {bwr.read_size = sizeof(readbuf);bwr.read_consumed = 0;bwr.read_buffer = (uintptr_t) readbuf;//调用ioctl发送数据。bwr结构体res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);if (res < 0) {fprintf(stderr,"binder: ioctl failed (%s)\n", strerror(errno));goto fail;}res = binder_parse(bs, reply, (uintptr_t) readbuf, bwr.read_consumed, 0);if (res == 0) return 0;if (res < 0) goto fail;}fail:memset(reply, 0, sizeof(*reply));reply->flags |= BIO_F_IOERROR;return -1;
}

在这里插入图片描述

数据要转换,binder_io参数是这个类型,内核驱动要求res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr);bwr是上图的类型。

ioctl收数据,也会收到binder_write_read,然后转化为binder_io

svcmgr_lookup看下面源码

uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name)
{uint32_t handle;//binder_io对缓冲区的管理unsigned iodata[512/4];//初始化结构体binder_iostruct binder_io msg, reply;//初始化就可以在缓冲池里面放数据 了bio_init(&msg, iodata, sizeof(iodata), 4);bio_put_uint32(&msg, 0);  // strict mode headerbio_put_string16_x(&msg, SVC_MGR_NAME);bio_put_string16_x(&msg, name);//binder_io发送给驱动if (binder_call(bs, &msg, &reply, target, SVC_MGR_CHECK_SERVICE))return 0;handle = bio_get_ref(&reply);if (handle)binder_acquire(bs, handle);binder_done(bs, &msg, &reply);return handle;
}

相关文章:

Android跨进程通信,IPC,RPC,Binder系统,C语言应用层调用

文章目录 Android跨进程通信&#xff0c;IPC&#xff0c;RPC&#xff0c;Binder系统&#xff0c;C语言应用层调用&#xff08;&#xff09;1.概念2.流程3.bctest.c3.1 注册服务&#xff0c;打开binder驱动3.2 获取服务 4.binder_call Android跨进程通信&#xff0c;IPC&#xf…...

数据结构【DS】栈

共享栈 共享栈的目的是什么&#xff1f; 目的:有效利用存储空间。 共享栈的存取数据时间复杂度为&#xff1f; 存取数据时间复杂度为O(1) 共享栈如何判空&#xff1f;如何判满&#xff1f; 两个栈的栈顶指针都指向栈顶元素&#xff0c;&#x1d461;&#x1d45c;&#x1d45d;…...

提高视频性能的 5 种方法

摆脱共享托管计划 如果您的网站每月收到数千名访问者&#xff0c;那么现在是时候放弃许多企业家和小型企业开始使用的共享托管计划了。在启动网站时选择廉价的托管计划是可以理解的&#xff0c;因为此类计划通常足以使用一年或更长时间&#xff0c;而不会影响性能。 在共享托…...

python有哪些高级的技术

Python作为一种功能强大且灵活的编程语言&#xff0c;具有许多高级技术和功能。以下是一些Python中常见的高级技术&#xff1a; 函数式编程&#xff1a;Python支持函数式编程范式&#xff0c;包括高阶函数、匿名函数&#xff08;lambda函数&#xff09;、闭包、以及针对序列的函…...

系列五、怎么查看默认的垃圾收集器是哪个?

一、怎么查看默认的垃圾收集器是哪个 java -XX:PrintCommandLineFlags -version...

用向量数据库Milvus Cloud搭建GPT大模型+私有知识库的定制AI助手——PPT大纲助手

随着人工智能技术的不断发展,AI助手在各行各业中扮演着越来越重要的角色。在商业领域,PPT演示是一种常见的沟通方式,而定制化的PPT大纲助手能够极大地提高PPT制作效率和质量。本文将介绍如何利用向量数据库Milvus Cloud搭建GPT大模型和私有知识库,构建一款高效的PPT大纲助手…...

浅谈基于云计算的环境智能监控系统

随着经济的飞速发展&#xff0c;环境污染也越来越严重&#xff0c;环境监控成为了政府与社会关注的焦点。本文提出了一种基于云计算的环境智能监控系统——EasyCVR&#xff0c;该系统综合应用了传感器、云计算、大数据、人工智能等技术&#xff0c;具有实时、准确、高效的监控能…...

向量机SVM代码实现

支持向量机&#xff08;SVM, Support Vector Machines&#xff09;是一种广泛应用于分类、回归、甚至是异常检测的监督学习算法。自从Vapnik和Chervonenkis在1995年首次提出&#xff0c;SVM算法就在机器学习领域赢得了巨大的声誉。这部分因为其基于几何和统计理论的坚实数学基础…...

基于STC12C5A60S2系列1T 8051单片的模数芯片ADC0809实现模数转换应用

基于STC12C5A60S2系列1T 8051单片的模数芯片ADC0809实现模数转换应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍模数芯片ADC0809介绍通过模数芯片ADC0809把电压模…...

16. @PostConstruct注解和开关原理(验证码开关、IP开关)

1►PostConstruct注解 PostConstruct是java自带的注解&#xff0c;会在java项目启动的时候先执行下面的方法 2►开关原理&#xff08;验证码开关&#xff09; 我们的项目具有验证码功能&#xff0c;旧版不支持关闭&#xff0c;新版已经支持关闭了。 我们打开页面“参数管…...

uniapp+vue+Springboot 公司网站0~1搭建 前端前期设计篇

原型图 client https://www.xiaopiu.com/h5/byId?typeproject&id653bc791940bbb14e4feeecf admin 客户端 apph5 页面 首页展示 经典用户案例轮播图设计师轮播图 经典用户案例 经典案例搜索详情经典案例详情 设计师查询&#xff08;待定&#xff09; 后台管理 ​ …...

MFC 对话框

目录 一、对话款基本认识 二、对话框项目创建 三、控件操作 四、对话框创建和显示 模态对话框 非模态对话框 五、动态创建按钮 六、访问控件 控件添加控制变量 访问对话框 操作对话框 SendMessage() 七、对话框伸缩功能实现 八、对话框小项目-逃跑按钮 九、小项…...

关于node安装和nvm安装的问题

node 1.已经自定义路径安装了node&#xff0c;但是在cmd输入node -v显示不是内部命令 路径问题&#xff1a;确保 Node.js 已经被添加到了系统的环境变量 PATH 中。PATH 环境变量包含了操作系统用来查找命令的位置。你可以通过以下步骤检查 Node.js 是否已被添加到 PATH&#x…...

react 手机端 rc-table列隐藏(根据相关条件是否隐藏)、实现图片上传操作

最近公司某一项目的手机端&#xff0c;新增需求&#xff1a;table中的附件要可以编辑&#xff0c;并且是在特定条件下可编辑&#xff0c;其他仅做展示效果。 查阅官方文档&#xff0c;没有发现是否隐藏这一属性&#xff0c;通过css控制样式感觉也比较麻烦&#xff0c;后面发现可…...

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】三维重建

目录 前言 几个高频面试题目 “基于RGB-D相机的三维重建"和传统的SFM和SLAM算法有什么区别?...

H110主板搭配魔改QNCW升级小记

最近搬家完毕&#xff0c;翻出来一块闲置已久的qncw&#xff0c;隐约记得是买的主板套装&#xff0c;现在主板早已不知踪影&#xff0c;剩下孤零零一个CPU&#xff0c;一起翻出来一个G3900T亮机CPU&#xff0c;应该是同时代的产物。 qncw百度上一搜&#xff0c;发现参数还行&am…...

Rust8.2 Fearless Concurrency

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 16: Fearless Concurrency 无畏并发 src/main.rs use std::thread; use std::time::Du…...

合并两个有序链表(冒泡排序实现)

实例要求&#xff1a;将两个升序链表合并为一个新的 升序 链表并返回&#xff1b;新链表是通过拼接给定的两个链表的所有节点组成的&#xff1b;实例分析&#xff1a;先拼接两个链表&#xff0c;在使用冒泡排序即可&#xff1b;示例代码&#xff1a; struct ListNode* mergeTwo…...

【iOS】——知乎日报第五周总结

文章目录 一、评论区展开与收缩二、FMDB库实现本地持久化FMDB常用类&#xff1a;FMDB的简单使用&#xff1a; 三、点赞和收藏的持久化 一、评论区展开与收缩 有的评论没有被回复评论或者被回复评论过短&#xff0c;这时就不需要展开全文的按钮&#xff0c;所以首先计算被回复评…...

gRPC 四模式之 双向流RPC模式

双向流RPC模式 在双向流 RPC 模式中&#xff0c;客户端以消息流的形式发送请求到服务器端&#xff0c;服务器端也以消息流的形式进行响应。调用必须由客户端发起&#xff0c;但在此之后&#xff0c;通信完全基于 gRPC 客户端和服务器端的应用程序逻辑。 为什么有了双向流模式…...

Kubernetes事件驱动架构实践:构建响应式微服务系统

Kubernetes事件驱动架构实践&#xff1a;构建响应式微服务系统 一、事件驱动架构概述 事件驱动架构是一种基于事件发布/订阅模式的分布式系统设计方法。在Kubernetes中实现事件驱动架构可以实现松耦合、高可扩展的微服务系统。 1.1 事件驱动模式 模式说明适用场景发布/订阅…...

Python爬虫绕过JA3/JA4指纹检测的TLS定制实战

1. 这不是“绕过检测”&#xff0c;而是理解TLS握手的底层语言你写好了一个Python爬虫&#xff0c;目标网站明明没上WAF、也没用Cloudflare&#xff0c;但一发请求就返回403——连HTML正文都没有&#xff0c;只有个空响应体。抓包一看&#xff0c;服务器在TCP三次握手之后、TLS…...

2026亲测:专业AI智能降重工具TOP1推荐

2026 年降 AIGC 工具已从“机械式文本改写”演进为多维度智能优化系统&#xff0c;核心评估指标涵盖 AI 痕迹识别精准度、专业语义一致性、格式结构完整性、长段落逻辑稳定性、降重适配性以及高校检测合规性。本次测评深入分析 5 款主流工具&#xff0c;测试内容覆盖中英文论文…...

【AIGC内容竞争力突围关键】:为什么92%的ChatGPT使用者不会“讲故事”?资深NLP架构师首曝4层认知断层

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AIGC内容竞争力突围的关键认知跃迁 当生成式AI从“能写”迈入“懂场景、知约束、可迭代”的新阶段&#xff0c;内容竞争力的本质已悄然迁移——它不再取决于单次输出的流畅度&#xff0c;而系于人机协同的认知…...

暗黑破坏神2现代重生:D2DX如何让经典游戏在4K宽屏时代焕发新生?

暗黑破坏神2现代重生&#xff1a;D2DX如何让经典游戏在4K宽屏时代焕发新生&#xff1f; 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2…...

基于SpringBoot的技术博客与开源知识分享平台毕设

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot技术栈的技术博客与开源知识分享平台以解决传统知识传播模式中存在的信息孤岛现象与协作效率低下问题。随着信息技术的快速发…...

TestDisk PhotoRec:免费开源数据恢复工具的终极完整指南

TestDisk & PhotoRec&#xff1a;免费开源数据恢复工具的终极完整指南 【免费下载链接】testdisk TestDisk & PhotoRec 项目地址: https://gitcode.com/gh_mirrors/te/testdisk 当您不小心删除了重要文件&#xff0c;或者硬盘分区突然消失时&#xff0c;那种恐慌…...

玩转谷歌开源 AI 终极端:在 Antigravity CLI (`agy`) 中无缝白嫖/调用 Claude

玩转谷歌开源 AI 终极端&#xff1a;在 Antigravity CLI (agy) 中无缝白嫖/调用 Claude 作为整天和终端打交道的开发者&#xff0c;如果你还没试过 Google 刚推出不久的 AI 终端 Agent —— Antigravity CLI (agy)&#xff0c;那你真的错过了效率神器。 它最让我惊艳的不是能在…...

论文提速的终极秘籍!常用的AI论文软件,秒出初稿不费力

作为一名刚完成毕业论文的过来人&#xff0c;我太懂写论文的痛苦了 —— 选题纠结、资料收集困难、逻辑梳理不清、反复修改头疼、格式排版繁琐... 直到我发现了这套 AI 写作工具组合&#xff0c;简直是论文写作的 "开挂神器"&#xff0c;效率直接翻倍&#xff0c;原本…...

JMeter接口测试进阶:从功能验证到生产级性能工程

1. 这不是“点点点就能跑通”的接口测试&#xff0c;而是你真正能扛住压测的底气很多人第一次打开 JMeter&#xff0c;以为它只是个“图形化 Postman”——填 URL、选方法、点执行&#xff0c;看到绿色 Success 就觉得“接口测完了”。我带过三届测试团队&#xff0c;几乎每届都…...