[Android]文件描述符透过Binder传输的原理

在Linux中,文件描述符都是属于进程的,用整数来表示。通过fork,虽然子进程和父进程都是打开同样的文件,但文件描述符却是不同的。
同样的文件描述符值在不同进程对应不同的文件描述符值数组。
所以文件描述符透过Binder来进行传输时,不能是简单的拷贝文件描述符值。
关键是要把对应的文件结构与一个新的文件描述符对应起来,这样另一个进程和原来的进程透过不同的文件描述符对应同一个文件。
幸好,打开文件的结构struct file是可以在进程间共享的,透过进程a的文件描述符来获取struct file,再在进程b中获取一个新的空文件描述符,再把它们关联起来,就实现了文件描述符在不同进程之间的传输。

关键函数及结构
int filedescripter;
//透过文件描述符获取打开文件struct file 结构
strcut file = fget(filedescripter)

//获取空的文件描述符
new_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC);

//建立关联
task_fd_install(target_proc, new_fd,strcut file);

参考:
《 Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析 》
http://blog.csdn.net/luoshengyang/article/details/6666491

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。