关于linux命名管道的使用细节

本文讲述了在一个使用管道进行数据中转的项目中遇到的问题,涉及随机访问文件的读取模式、写端异常导致的读端阻塞,以及处理写端崩溃时读端的困境。解决策略包括使用r方式而非rw方式,并指出在特定情况下,可能需要依赖管理进程强制退出读端。
摘要由CSDN通过智能技术生成

项目背景,是使用管道做一个推送式的数据中转。c将数据块吐入管道,另一端java接受解析并上传服务器。
数据块是以报文+不定长数据的形式传递的,所以使用
fp = new RandomAccessFile(fifo, “r”); 方式打开来实现指定偏移位的读取
这当中存在一些问题
1.读端必须以"r"方式打开,"rw"方式会造成无法感知写端的close()操作

2.当写端异常并退出后,读端fp.read(buf)会阻塞,想要退出必须由监控现场再以rw方式打开此管道文件并主动close,读段才能接收到关闭信息并退出阻塞

3.最难搞的一种场景。当写端在读端new RandomAccessFile之前就已经崩溃或者在open管道文件前就已经奔溃,读端会永久阻塞在new RandomAccessFile这一步。这时监控线程异步打开此管道也没用。但是rw方式打开管道文件并不会阻塞。因为是jni接口,中断读段线程的方式也是无法退出的。当前发现的有效退出方式只有由管理进程kill -9 pid一种。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值