前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Framework用到了哪些进程通信(IPC)的方式

Android Framework用到了哪些进程通信(IPC)的方式

作者头像
码农帮派
发布2021-02-25 11:52:27
6690
发布2021-02-25 11:52:27
举报
文章被收录于专栏:码农帮派码农帮派码农帮派

Android Framework中用到的Linux跨进程通信的方式:

  • 管道
  • socket
  • 共享内存
  • 信号

管道通信 pipe(fds)

半双工,单向的 (一个管道要么只能读,要么只能写,数据的读/写是单向的,要想实现既能读又能写,就需要使用两个管道来完成)

一般是在父子进程之间使用 (无名管道一般是在父进程fork子进程的过程中使用,有名管道可以在任意进程之间使用,但前提是两个进程都需要知道管道的名称)

上面的代码中使用pipe调用生成了一对管道的描述符,描述符fd[1]是用来想管道中写入数据的,描述符fd[0]是用来想管道中读取数据的。在父进程中使用fork创建子进程,子进程就会继承创建的管道描述符。我们想在父进程中通过管道向子进程传递消息,我们就可以直接在pid等于0的子进程中,将写描述符fd[1]关闭,并在pid大于0的父进程中将读描述符fd[0]关闭,然后向写描述符fd[1]中写入数据,在子进程中从读描述符fd[0]中读取数据。

socket通信

全双工的,既可以读又可以写

通信的两个进程之间无需存在亲缘关系

在Android Framework层,AMS通知Zygote启动子进程的过程,就是使用socket来进行信息的通信。

共享内存

很快,无需多次拷贝(前面的通信方式,管道和socket都涉及到数据的多次拷贝,因此不能传递数据量太大的消息,共享内存是不需要数据的多次拷贝的,拿到文件描述符之后,将其映射到两个进程的内存空间中,进程之间就可以通过读写文件进行通信了)

进程之间无需存在亲缘关系

在Android中,涉及到图片的跨进程传递,就是使用共享内存实现的。

信号

单向的,信号是没有回调的,发出去之后的事情就不知道了

只能带一个信号,不能带别的参数

知道进程的pid就能够发信号了,也可以一次给一群进程发信号(Android中信号的发送是需要权限的,除非是root权限,或者进程的UID相同,才能够给这些进程发信号)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农帮派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档