使用 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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...