想在android系统层写两个可执行程序(main_a,main_b),使用ndk-build编译。
      main_a 用来录音,main_b通过进程件套通信方式从main_a中把录音数据接收过来保存成文件。对于android来说,能想到的进程间通信方式是mmap,(匿名管道不行;命名管道有长度限制;匿名共享内存貌似得不到相同的文件句柄,而且内部也是使用mmap实现的)。现在能用mmap共享数据,但是两个进程之间读写数据无法做同步。(据我了解linux中的信号量、消息队列、shm在ndk中是不支持的!!!)
      请了解安卓进程间同步的高手帮忙指点一下我应该如何实现这两个进程对mmap共享内存的同步。非常感谢。

解决方案 »

  1.   

    i found this.
      

  2.   

    thank you very much. 
    非常感谢。看来有问题还是需要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的时候可以指定是否进程间共享,但是需要把这个锁放到进程共享缓存中,现在对如何在共享缓存中创建锁不是很理解,正在尝试。
         欢迎探讨。
      

  3.   

    thank you very much. 
    非常感谢。看来有问题还是需要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
       所以应该是我的测试平台不支持此接口。
      

  4.   


    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?
      

  5.   

    i did not try unamed semaphore. because it does not support my need.
      

  6.   

    其实你这个需求和android里面的audioflinger的audiotrack有点类似。
    audioflinger里面是通过ashmem申请了1块大内存,然后把内存分块,client一直去都读数据,有可用的数据块就拿过来,用完还回去。
      

  7.   

    一些更新:
    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.
      

  8.   

    audio_track_cblk_t,这个类型的使用好像也是在共享内存中创建了一个进程共享的同步锁,这两天正好看到这个地方,和mmap中使用一个互斥锁是同样的道理。
    以前以为安卓的ashmem只能是客户端拿到服务端的文件描述符,然后进行mmap得到共享地址。不过看到audiotrack和audioflinger使用ashmem时,貌似没看到文件描述符相关的地方,看来还需要继续研究。
      

  9.   

    使用binder的话需要用service吧?一个server 一个client。(我是这么理解的)
    我现在使用的就是共享内存中使用互斥锁,暂时能实现功能,还没有解决死锁的问题,正在考虑呢。
      

  10.   

    audio_track_cblk_t,这个类型的使用好像也是在共享内存中创建了一个进程共享的同步锁,这两天正好看到这个地方,和mmap中使用一个互斥锁是同样的道理。
    以前以为安卓的ashmem只能是客户端拿到服务端的文件描述符,然后进行mmap得到共享地址。不过看到audiotrack和audioflinger使用ashmem时,貌似没看到文件描述符相关的地方,看来还需要继续研究。
    基本原理没变,还是传递fd,然后mmap,但是可以同时传递一个offset来标示位置。看看MemoryHeapBase这个类。
      

  11.   

    mmap的内存使用自定义结构体方式,其中包含一个互斥锁成员,用这个进行lock和unlock。其他也没找到更合适的方式了。
      

  12.   

    本地socket可以么