问题描述
给定一对用于与另一个进程通信的命名管道(FIFO,一个用于读取,一个用于写入), 我想以可中断的方式打开两个管道。
我已经测试了 Files.newInputStream()
、Files.newByteChannel()
和 new RandomAccessFile()
。
我得到的问题是,当我以只读方式打开管道(或者只写)时,open()
调用将阻塞,因此执行 Files.newInputStream()
等的线程将阻塞,直到另一个进程有打开了管道的末端。
这意味着我不可能中断打开过程,例如当我决定关闭一个模块或连接到另一组管道时。 close() 调用必须等待管道打开。
我发现的一种解决方法是使用模式 rw
(或 StandardOpenOption.READ,StandardOpenOption.WRITE
)打开我的文件。这确保有人打开“另一端”(我自己),因此 open()
不会阻塞,但 read()
会按预期阻塞。
然而,这破坏了检测关闭管道的其他进程的能力。通常,我会在写入端收到 Broken Pipe
异常,而在另一端收到 EOF / ClosedByInterruptException
。仅当我是管道上的最后一个读取器/写入器时才会发生这种情况,如果我同时打开两个管道 R+W,这种情况将永远不会发生。
Thread.interrupt() 将中断 NIO 读取(例如 stream.getChannel().read(x),但不会中断 open()。
现在:是否有可能从 Java 中的 ByteChannel
调用中获得 InputStream
或 open(O_NONBLOCK)
?
我发现和跟踪的所有调用路径都不可能通过该标志。 open(3p) 告诉我这将成功返回读取(并希望在 read()
上阻塞),并且写入端将错误 ENXIO,以便我可以稍后重试(但仍有机会如果我愿意,请中断我的重试)。
甚至 AsynchronousFileChannel
似乎在打开其线程池之前调用了 open()
,因此会出现同样的问题。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)