共享内存
System V 共享内存
共享内存区具有内核限制
Posix 共享内存
must be link with -lrt
shm_open 参数name的规则,
链接(unp2书本上的两个例子,需要注意unix系版本的不同,lubantu对应的是太阳系)
循环缓冲区,
维基链接,获取:
- 工作原理,动态图显示
- 循环缓冲机制(公共的控制信息),实现cb的方法:四个指针或两个指针+两个整数
环形缓冲区为为什么是lock-free的?,
链接
- 提问者的一段话:if the most recent operation was a write, the buffer must be full, and conversely if it was a read, it must be empty.(这提供了判断空满的方式,需要推断出来的)
- 实质上:CB仅限于单写单读的方式,如果多个(>2)对象操作buff时,没有办法判断full/empty的。
环形缓冲区的实现:
加锁(kfifo的实现方式),
链接
无锁(仿kfifo),
链接
无锁实际上是很难正确使用的,往往会造成意外错误,所以最后还是要加上一个信号量。
对于本次的需求,调试过程如下:
- 读函数的数据区结构获取,因为存在未知量,需要直接获取完整的结构数据,暴力使用循环读取解决。
- 写函数的分段写入,需要仔细考虑数据区结构和数据的分别写入,这分很多种情况。
消息队列
消息队列实现进程间的双向通信,
链接(System V)
使用posix消息队列,根据unp2,思考入下:
- notify函数,调用signal信号处理或thread处理,两者实质都是异步信号处理
- 需要注意,signal异步信号处理程序,需要使用异步信号安全函数(忘记是啥子概念了)
- 如果是使用signal信号处理,根据unp2的6个例子分析得:sig的4/5例子是可以运用在实际工程中,thread例子也是可以的
- sig例子4:使用sigwait()函数代替异步信号处理程序,unp2还注明:这是多线化的进程的更安全/一般化的处理方式
- sig例子5:暂时没看
- thread例子:在线程属性参数里面不设置,则为系统默认(将作为脱离的线程被创建,直接使用pthread_exit退出线程即可回收所有资源,不能使用pthread_join来等待一个线程终止)
信号量
这好像没什么可以写的,非常直接地使用,也没什么遇见大的问题。
POXIS与System V对比
循环缓冲区
以下,主要是对比队友与我写的代码,并以此作为分析。