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

亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述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/
【10.3android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)】
测试:
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










































    推荐阅读