[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

时间: 2024-10-14 11:02:14

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

套接字文件描述符消耗小细节分析

套接字是通信端点的抽象.正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字.套接字描述符在UNIX系统中被当作是一种文件描述符.事实上,许多处理文件描述符的函数(read和write)可以用于处理套接字描述符. ——<unix环境高级编程> WEB应用客户端(浏览器或APP等)与服务端的通信大多数是通过HTTP或HTTPS协议进行的.而套接字(Socket)应该算是OSI七层网络模型中应用层与传输层直接的抽象层,它是面向应用层的一个编程接口.而HTTP/HTTPS则位于应用层,就是通

通过UNIX域套接字传递文件描述符

传送文件描述符是高并发网络服务编程的一种常见实现方式.Nebula 高性能通用网络框架即采用了UNIX域套接字传递文件描述符设计和实现.本文详细说明一下传送文件描述符的应用. 1. TCP服务器程序设计范式 ??开发一个服务器程序,有较多的的程序设计范式可供选择,不同范式有其自身的特点和实用范围,明了不同范式的特性有助于我们服务器程序的开发.常见的TCP服务器程序设计范式有以下几种: 迭代服务器 并发服务器,每个客户请求fork一个子进程 预先派生子进程,每个子进程无保护地调用accept 预先

Linux 套接字与文件描述符

端口和套接字,用于确定指定主机上的哪个本地进程使用了哪个协议和哪台远程主机上的哪个进程进行了通信.端口和套接字的使用可以基于以下几点: ①为每个应用过程分配一个过程标识符(Process ID),每次启动一个进程时,这个ID都可能是不同的. ②进程ID因操作系统平台不同而不同,因而它们是不统一的. ③一个服务器过程能够同时与多个客户连接,因而简单的连接标识符不可能是唯一的. 端口和套接字概念提供了一种以统一的方式唯一地标识连接以及参与连接的程序和主机的方法,而不管特定的过程ID. (1)端口 

套接字与文件描述符

  TCP服务器端: int socket(int domain , int type , int protocol) domain(协议族):常用的协议族便是IPV4(PF_INET), IPV6(PF_INET6),本地通信协议的UNIX族(PF_LOCAL) type:数据传输类型:典型数据传输类型:面向连接的套接字(SOCK_STREAM),面向消息的套接字(SOCK_DGRAM) protocal:具体协议: 返回套接字文件描述符,在linux中,不区分套接字和文件,统一用文件描述符来

文件描述符与文件指针等文件操作的几个问题

1.二者对比: 文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件.它是系统调用产生的. 文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符.它用于ANSI C标准的IO库调用中,用于标识文件.fopen是依赖于open的: 既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信息. 文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的.

UNIX环境编程学习笔记(4)——文件I/O之dup复制文件描述符

lienhua342014-08-23 UNIX 提供了两个函数 dup 和 dup2 用于复制一个现存的文件描述符. #include <unistd.h> int dup(int filedes); int dup2(int filedes, int filedes2); 返回值:若成功则返回新的文件描述符,如出错则返回-1. 由 dup 函数返回的文件描述符一定是当前可用文件描述符中的最小描述符.用 dup2 函数则可以通过参数 filedes2 指定目标文件描述符.如果filedes2

文件描述符设置

系统级的限制     查看上限              sysctl -a | grep 'fs.file-max' 查看使用情况        fs.file-nr 修改上限              在/etc/sysctl.conf文件添加   fs.file-max=65536:    然后执行  sysctl -p 进程级别的限制 查看上限              ulimit -n 查看使用情况        lsof 修改上限 修改/etc/security/limits.co

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con

Linux中的文件描述符与打开文件之间的关系

1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个新的文件,它的文件描述符会是3.POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号