10.3、android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)

3. 任意进程间通信(socketpair_binder)

进程每执行一次open打开文件,都会在内核中有一个file结构体表示它;

对每一个进程在内核中都会有一个task_struct表示进程,这个结构体内部有个files_struct结构体,这个结构体里面有个fdtble结构体,这个结构体里有个struct file **fd,fd就是个数组,fd[open时返回的句柄]就保存的对应文件的file结构体

因此不同进程的文件句柄只在本进程中有含义,如果想要在进程外面使用这个文件句柄,需要让外面进程的fd[任何句柄都可以]指向需要获得的目的进程的file

这里使用binder来传输文件句柄:

(1)APP1  open(file)得到fd1;

(2)通过binder驱动,根据fd1得到file:files->fdt->fd[fd1]

(3)从APP2的files->fdt->fd取出空项fd2,让fd[fd2]指向该file

(4)APP1通过fd1,APP2通过fd2就可以访问同一个file文件了,fd1和fd2不一样


取出APP_0004_Binder_CPP_App V4来修改:
第一次:
git clone https://github.com/weidongshan/APP_0004_Binder_CPP_App.git

更新:
git pull origin

取出指定版本:
git checkout v4 // 兼容APP_0005_Binder_JAVA_App


参考代码:
frameworks\base\core\jni\android_view_InputChannel.cpp (用binder传文件句柄)
server端写fd: android_view_InputChannel_nativeWriteToParcel
parcel->writeDupFileDescriptor
client端读fd: android_view_InputChannel_nativeReadFromParcel
int rawFd = parcel->readFileDescriptor();
int dupFd = dup(rawFd);

frameworks\native\libs\binder\Parcel.cpp


支持传输文件句柄的程序 v5:
第一次:
git clone https://github.com/weidongshan/APP_0004_Binder_CPP_App.git

更新:
git pull origin

取出指定版本:
git checkout v5 // v5, use binder to transfer file descriptor


编译:
把 APP_0004_Binder_CPP_App 放入 /work/android-5.0.2/frameworks/testing

cd /work/android-5.0.2/
. setenv
lunch //选择单板
mmm frameworks/testing/APP_0004_Binder_CPP_App
cp /work/android-5.0.2/out/target/product/tiny4412/system/bin/test_* /work/nfs_root/android_fs/


测试:
su
busybox mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
logcat HelloService:* GoodbyeService:* TestService:* *:S &
echo asfsdfasdf > 1.txt
./test_server 1.txt &
./test_client readfile

猜你喜欢

转载自www.cnblogs.com/liusiluandzhangkun/p/9161570.html