Update Framework IPC 方式汇总.md

master
Omooo 5 years ago
parent ab41006736
commit f86c9acc11
  1. 7
      blogs/Android/Framework/Interview/进程间通信相关/Framework IPC 方式汇总.md

@ -18,6 +18,8 @@ Android Framework 里面用到了哪些 IPC 方式?
1. 半双工,单向的 1. 半双工,单向的
2. 一般是在父子进程之间使用 2. 一般是在父子进程之间使用
管道使用起来还是很方便的,主要是可以和 epoll 相结合监听读写事件。
![](https://i.loli.net/2020/03/27/UcCtmGaYMWRoseb.png) ![](https://i.loli.net/2020/03/27/UcCtmGaYMWRoseb.png)
Framework 哪用到了管道? Framework 哪用到了管道?
@ -44,12 +46,14 @@ epoll 是如何监听读端事件的?
```c++ ```c++
int Looper::pollInner(int timeoutMillis){ int Looper::pollInner(int timeoutMillis){
struct epoll_event eventItems[EPOLL_MAX_EVENTS]; struct epoll_event eventItems[EPOLL_MAX_EVENTS];
// epoll_wait 阻塞在这
int eventCount = epoll_wait(mEpollFd, eventItems, ...); int eventCount = epoll_wait(mEpollFd, eventItems, ...);
for(int i=0;i<eventCount;i++){ for(int i=0;i<eventCount;i++){
int fd = eventItems[i].data.fd; int fd = eventItems[i].data.fd;
uint32_t epollEvents = eventItems[i].events; uint32_t epollEvents = eventItems[i].events;
if(fd == mWakeReadPipeFd){ if(fd == mWakeReadPipeFd){
if(epollEvents&EPOLLIN){ if(epollEvents&EPOLLIN){
// 把管道里面的东西读出来
awoken(); awoken();
} }
} }
@ -95,6 +99,7 @@ void runSelectLoop(String abiList){
1. 很快,不需要多次拷贝 1. 很快,不需要多次拷贝
2. 进程之间无需存在亲缘关系 2. 进程之间无需存在亲缘关系
3. 传输大数据
涉及进程之间大数据量传输主要就是图像相关的了: 涉及进程之间大数据量传输主要就是图像相关的了:
@ -140,6 +145,8 @@ public class Process{
sendSignal(pid, SIGNAL_KILL); sendSignal(pid, SIGNAL_KILL);
} }
} }
// Zygote 监听的 SIGCHID 信号,Zygote 启动子进程完成之后需要关注子进程挂了没有
// 如果挂了,就需要回收相关资源,避免子进程成为一个僵尸进程
static void SetSigChldHandler(){ static void SetSigChldHandler(){
struct sigaction sa; struct sigaction sa;
memset(&sa, 0, sizeof(sa)); memset(&sa, 0, sizeof(sa));

Loading…
Cancel
Save