10.3android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)
Posted 拉风摊主
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10.3android输入系统_必备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
参考代码:
frameworksasecorejniandroid_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
ativelibsinderParcel.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
以上是关于10.3android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)的主要内容,如果未能解决你的问题,请参考以下文章
Android必备知识点- Android文件(File)操作