想在android系统层写两个可执行程序(main_a,main_b),使用ndk-build编译。
main_a 用来录音,main_b通过进程件套通信方式从main_a中把录音数据接收过来保存成文件。对于android来说,能想到的进程间通信方式是mmap,(匿名管道不行;命名管道有长度限制;匿名共享内存貌似得不到相同的文件句柄,而且内部也是使用mmap实现的)。现在能用mmap共享数据,但是两个进程之间读写数据无法做同步。(据我了解linux中的信号量、消息队列、shm在ndk中是不支持的!!!)
请了解安卓进程间同步的高手帮忙指点一下我应该如何实现这两个进程对mmap共享内存的同步。非常感谢。
main_a 用来录音,main_b通过进程件套通信方式从main_a中把录音数据接收过来保存成文件。对于android来说,能想到的进程间通信方式是mmap,(匿名管道不行;命名管道有长度限制;匿名共享内存貌似得不到相同的文件句柄,而且内部也是使用mmap实现的)。现在能用mmap共享数据,但是两个进程之间读写数据无法做同步。(据我了解linux中的信号量、消息队列、shm在ndk中是不支持的!!!)
请了解安卓进程间同步的高手帮忙指点一下我应该如何实现这两个进程对mmap共享内存的同步。非常感谢。
解决方案 »
- AlertDialog中setPositiveButton的疑问
- Android短信拦截
- 菜鸟的我想做以下简单效果,但始终没概念,谁能帮帮忙!!
- 如何给Activity添加类似dialog中的setPositiveButton、setNegativeButton等Button?
- android客户端,如何通过POST方式访问PHP服务端
- android draw 多线程 变量同步问题急啊
- 按两次返回键结束整个程序
- android客户端怎样连接服务器
- 实现Fragment之间的通信
- java代码进行布局的时候 想用linearlayout添加多个子view该怎么做
- 安卓webview如何防止其他应用植入banner广告
- Android蓝牙接收数据,并绘制实时心电图
非常感谢。看来有问题还是需要google,度娘不是很给力。
linux系统的相关IPC和进程间同步方式我这段时间都看过,比较好用的SYSTEM v机制是android上没有支持的,所以其中的共享内存(shm)、信号量( sem)、消息队列在android中是没有支持的。
对于semaphore.h中的有名信号量和无名信号量,我尝试过sem_open()的有名信号量,在android中好像是open失败的(有待进一步验证一下!!),而且使用信号量需要保证post的时候另一端已经在wait,这个不太符合我的需求, 所以一直没考虑用信号量。
对于“pthread mutex stored in the mmap'ed region”,这也是我现在正在尝试的操作。按照资料上说init mutex的时候可以指定是否进程间共享,但是需要把这个锁放到进程共享缓存中,现在对如何在共享缓存中创建锁不是很理解,正在尝试。
欢迎探讨。
非常感谢。看来有问题还是需要google,度娘不是很给力。
linux系统的相关IPC和进程间同步方式我这段时间都看过,比较好用的SYSTEM v机制是android上没有支持的,所以其中的共享内存(shm)、信号量( sem)、消息队列在android中是没有支持的。
对于semaphore.h中的有名信号量和无名信号量,我尝试过sem_open()的有名信号量,在android中好像是open失败的(有待进一步验证一下!!),而且使用信号量需要保证post的时候另一端已经在wait,这个不太符合我的需求, 所以一直没考虑用信号量。
对于“pthread mutex stored in the mmap'ed region”,这也是我现在正在尝试的操作。按照资料上说init mutex的时候可以指定是否进程间共享,但是需要把这个锁放到进程共享缓存中,现在对如何在共享缓存中创建锁不是很理解,正在尝试。
欢迎探讨。
对于android中调用sem_open(),我的结果如下:
调用代码:
#define SEMNAME "SETMODE"
sem_t * mutex=NULL;
mutex = sem_open(SEMNAME, O_CREAT, 0666, 1);
if(mutex == SEM_FAILED){
LOGD(TAG,"sem_open error");
printf("sem_open error\n");
sem_unlink(SEMNAME);
return -3;
}else{
LOGD(TAG,"sem_open success");
}
打印log:D/TAG( 2382): sem_open error
所以应该是我的测试平台不支持此接口。
One note: if you plan to use semaphores in shared memory, you must
explicitly specify it in sem_init call:
sem_init(&sem, 1, 0);
any luck?
audioflinger里面是通过ashmem申请了1块大内存,然后把内存分块,client一直去都读数据,有可用的数据块就拿过来,用完还回去。
you can use Binder in a native way.
there are something like ParcelFileDescriptor,you can pass file descriptor around between process.
some mmap and flock call.
以前以为安卓的ashmem只能是客户端拿到服务端的文件描述符,然后进行mmap得到共享地址。不过看到audiotrack和audioflinger使用ashmem时,貌似没看到文件描述符相关的地方,看来还需要继续研究。
我现在使用的就是共享内存中使用互斥锁,暂时能实现功能,还没有解决死锁的问题,正在考虑呢。
以前以为安卓的ashmem只能是客户端拿到服务端的文件描述符,然后进行mmap得到共享地址。不过看到audiotrack和audioflinger使用ashmem时,貌似没看到文件描述符相关的地方,看来还需要继续研究。
基本原理没变,还是传递fd,然后mmap,但是可以同时传递一个offset来标示位置。看看MemoryHeapBase这个类。