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