Linux-IPC

共享内存

System V 共享内存
共享内存区具有内核限制

Posix 共享内存
must be link with -lrt
shm_open 参数name的规则, 链接(unp2书本上的两个例子,需要注意unix系版本的不同,lubantu对应的是太阳系)

循环缓冲区, 维基链接,获取:
  1. 工作原理,动态图显示
  2. 循环缓冲机制(公共的控制信息),实现cb的方法:四个指针或两个指针+两个整数
环形缓冲区为为什么是lock-free的?, 链接
  1. 提问者的一段话:if the most recent operation was a write, the buffer must be full, and conversely if it was a read, it must be empty.(这提供了判断空满的方式,需要推断出来的)
  2. 实质上:CB仅限于单写单读的方式,如果多个(>2)对象操作buff时,没有办法判断full/empty的。
环形缓冲区的实现:
加锁(kfifo的实现方式), 链接
无锁(仿kfifo), 链接

无锁实际上是很难正确使用的,往往会造成意外错误,所以最后还是要加上一个信号量。
对于本次的需求,调试过程如下:
  1. 读函数的数据区结构获取,因为存在未知量,需要直接获取完整的结构数据,暴力使用循环读取解决。
  2. 写函数的分段写入,需要仔细考虑数据区结构和数据的分别写入,这分很多种情况。

消息队列

消息队列实现进程间的双向通信, 链接(System V)
使用posix消息队列,根据unp2,思考入下:
  1. notify函数,调用signal信号处理或thread处理,两者实质都是异步信号处理
  2. 需要注意,signal异步信号处理程序,需要使用异步信号安全函数(忘记是啥子概念了)
  3. 如果是使用signal信号处理,根据unp2的6个例子分析得:sig的4/5例子是可以运用在实际工程中,thread例子也是可以的
  4. sig例子4:使用sigwait()函数代替异步信号处理程序,unp2还注明:这是多线化的进程的更安全/一般化的处理方式
  5. sig例子5:暂时没看
  6. thread例子:在线程属性参数里面不设置,则为系统默认(将作为脱离的线程被创建,直接使用pthread_exit退出线程即可回收所有资源,不能使用pthread_join来等待一个线程终止)

信号量

这好像没什么可以写的,非常直接地使用,也没什么遇见大的问题。


POXIS与System V对比


循环缓冲区

以下,主要是对比队友与我写的代码,并以此作为分析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值