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

项目背景,是使用管道做一个推送式的数据中转。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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux环境下,命名管道(Named Pipe)是一种特殊的文件类型,也称为FIFO文件,可以用于进程之间的通信。与匿名管道不同的是,命名管道可以在文件系统中创建一个特殊文件,进程可以通过该文件进行通信,而不需要像匿名管道一样必须在父进程中创建。 命名管道使用分为两个步骤: 1. 创建命名管道 可以使用mkfifo命令在文件系统中创建命名管道,命令格式如下: ``` mkfifo [option] filename ``` 其中,filename表示要创建的命名管道的文件名。例如,要在当前目录下创建一个名为mypipe的命名管道,可以使用以下命令: ``` mkfifo mypipe ``` 2. 使用命名管道进行通信 命名管道创建后,进程可以像使用普通文件一样使用它进行通信。例如,一个进程可以将数据写入管道,另一个进程可以从管道中读取数据。 要写入数据到命名管道,可以使用重定向符号“>”将数据写入到管道中,例如: ``` echo "hello world" > mypipe ``` 要从命名管道中读取数据,可以使用重定向符号“<”将管道中的数据读取到标准输出中,例如: ``` cat < mypipe ``` 需要注意的是,命名管道是一个阻塞的设备,如果没有进程打开它进行读写,写入数据的进程会一直阻塞,直到有进程打开它进行读取。同样地,如果没有数据可读,从管道中读取数据的进程也会一直阻塞,直到有数据可读。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值