Android Framework中用到的Linux跨进程通信的方式:
管道通信 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相同,才能够给这些进程发信号)