1,有名管道
服务端创建有名管道文件(假设名字为path)
1)access(path.c_str(), F_OK) == -1先判断文件是否已存在;
2)mkfifo(path.c_str(), 0777) != 0就创建了管道文件;
3)open(path.c_str(), O_RDWR|O_NONBLOCK)打开管道文件,之后就可以使用open返回的文件描述符读写管道;
客户端只需要打开管道文件即可使用管道,要求客户端启动晚于服务端。
2,信号量
服务端和客户端都通过sem_open的方式打开信号量,传入参数是信号量的名称,返回值是sem_t指针;
sem_open(path.c_str(), O_CREATE);
sem_close关闭信号量,并且通过sem_unlink把信号量名称解绑;
P操作sem_wait,V操作sem_post;
3,匿名共享内存
1)打开匿名共享内存文件:open("/dev/ashmem", O_RDWR)
2)获取打开文件描述符所指向共享内存大小:ioctl(fd, ASHMEM_GET_SIZE, NULL),如果大小不为0,则可以直接mmap映射mmap(NULL, size, PORT_READ|PORT_WRITE, MAP_SHARED, fd, 0);否则,需要重新申请大小;
3)重新申请:先设置名称ioctl(fd, ASHMEM_SET_NAME, name),然后设置大小ioctl(fd, ASHMEM_SET_SIZE, size),然后映射;
4)共享内存的文件描述符可以通过Android的ParcelFileDescriptor传递到消费者进程;