如何解决使用 O_NONBLOCK
给定一对用于与另一个进程通信的命名管道(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 举报,一经查实,本站将立刻删除。