使用 O_NONBLOCK

如何解决使用 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 调用中获得 InputStreamopen(O_NONBLOCK)

我发现和跟踪的所有调用路径都不可能通过该标志。 open(3p) 告诉我这将成功返回读取(并希望在 read() 上阻塞),并且写入端将错误 ENXIO,以便我可以稍后重试(但仍有机会如果我愿意,请中断我的重试)。

甚至 AsynchronousFileChannel 似乎在打开其线程池之前调用open(),因此会出现同样的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?