使用O_NONBLOCK在Java中打开文件

使用O_NONBLOCK在Java中打开文件,java,unix,nonblocking,mkfifo,Java,Unix,Nonblocking,Mkfifo,给定一对用于与另一进程通信的命名管道(FIFO,一个用于读取,一个用于写入), 我想以可中断的方式打开两个管道 我已经测试了文件.newInputStream(),文件.newbytechnel()和新随机访问文件()。 我遇到的问题是,当我以只读(即只写)方式打开管道时,open()调用将阻塞,因此执行文件的线程。newInputStream()等将阻塞,直到另一个进程打开其管道的末端 这意味着我不可能中断打开过程,例如,当我决定关闭一个模块或连接到另一组管道时。该close()调用必须等待管

给定一对用于与另一进程通信的命名管道(FIFO,一个用于读取,一个用于写入), 我想以可中断的方式打开两个管道

我已经测试了
文件.newInputStream()
文件.newbytechnel()
新随机访问文件()。
我遇到的问题是,当我以只读(即只写)方式打开管道时,
open()
调用将阻塞,因此执行
文件的线程。newInputStream()
等将阻塞,直到另一个进程打开其管道的末端

这意味着我不可能中断打开过程,例如,当我决定关闭一个模块或连接到另一组管道时。该close()调用必须等待管道打开

我发现的一种解决方法是使用模式
rw
(或
StandardOpenOption.READ、StandardOpenOption.WRITE
)打开我的文件。这确保有人打开“另一端”(我自己),这样
open()
不会阻塞,而是
read()
会按预期阻塞

但是,这破坏了检测关闭管道的其他进程的能力。通常,我会在写入端得到一个
断管
异常,在另一端得到一个EOF/
ClosedByInterruptException
。只有当我是管道上的最后一个读写器时才会发生这种情况,如果我将两个管道都打开R+W,这种情况就永远不会发生。 Thread.interrupt()将中断NIO读取(f.ex.stream.getChannel().read(x),但不会中断open()

现在:是否有可能通过techannel
InputStream
从Java中的
open(O_NONBLOCK)
调用获取

我找到并跟踪的所有调用路径都不可能传递该标志。它告诉我这将成功返回以进行读取(并希望阻塞
read()
),并且写入端将出现错误ENXIO,以便我可以稍后重试(但如果我选择,仍然有机会中断重试)


甚至
AsynchronousFileChannel
似乎也在调用
open()
在打开其线程池之前,这也会有同样的问题。

为什么不在单独的线程中使用阻塞操作?然后可以将读取操作包装到一个函数中,该函数检查打开的操作是否完成。我会,但我永远无法关闭管道(当它被阻塞时)--每次我要更改文件时都会锁定线程。此外,我无法同步关闭。请检查是否可以使用
thread.interrupt()
将线程从被阻止的
文件中取出。newInputStream()
。如果函数可中断,则会导致
InterruptedException
。已经执行了。thread.interrupt()可以中断NIO读取(f.ex.
stream.getChannel().read(x)
,但不能中断
open()
请您的问题添加信息,而不是只回答注释。