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传递到消费者进程;
本文介绍了有名管道的创建及使用流程,包括判断文件是否存在、创建管道文件、打开及读写管道;同时概述了信号量的使用方法,涉及通过sem_open打开信号量、关闭信号量及信号量的P/V操作。
1318

被折叠的 条评论
为什么被折叠?



