【问题标题】:How to detect if a windows named pipe has been closed?如何检测 Windows 命名管道是否已关闭?
【发布时间】:2013-12-03 13:27:59
【问题描述】:

我有一个第三方程序,可以将数据放入名为管道的窗口中。

我通过

访问管道
String pipename = "\\\\.\\pipe\\the_pipe";
RandomAccessFile pipe = new RandomAccessFile(pipename, "r");
DataInputStream input = new DataInputStream(Channels.newInputStream(pipe.getChannel()));

因此,有时有人会在我的小型数据转换工具(当然会关闭管道)之前关闭第三方程序。发生这种情况时,我的工具会将收到的最后一百万次消息写入结果文件,并在数小时内成功将每个硬盘填充到最后一个字节,因为我无法检查管道是否已关闭。

我尝试过的事情:

// checking file descriptor and file channel
if(!(pipe.getFD().valid() && pipe.getChannel().isOpen())) {
  // quit
}

但这两个选项都不会触发。

是否有其他方法可以访问可以获取此类信息的命名管道? 还是我忽略了什么?

【问题讨论】:

  • isOpen() 只告诉你是否还没有结束你的结局。 isValid() 只告诉你 FD 是否仍然有效,直到你关闭为止。
  • 啊,也感谢您指出这一点!最后我真的忽略了异常处理,所以这是我这边的一个错误——不缺乏知识。 ;)

标签: java windows named-pipes


【解决方案1】:

发生这种情况时,我的工具会将收到的最后一百万次消息记录到结果文件中

仅当您的工具忽略 EOFExceptions 和来自 read() 的 -1 返回值时。

【讨论】:

  • 非常好!我真的“忽略”了它,但意外......因为我在处理原始文件读取的那个 catch 块中有一些决定,当我不读取文件时我忘记处理 EOFException 。谢谢!
【解决方案2】:

我建议查看JNA 以直接访问命名管道。是的,如果你使用 JNA,你可以检测到管道关闭。

我在 github.com 上的一个名为 NuProcess 的项目中这样做了。特别是查看com.zaxxer.nuprocess.windows 包。看WindowsProcess.createPipes()设置管道的方法(代码创建两端,你只需要一个)。

在读取方面,NuProcess 使用 Windows IOCompletionPorts 进行异步 I/O(在 ProcessCompletions.java 中),这对于您需要(或不需要)来说可能是多余的。但是,一旦您弄湿了设置管道,您应该能够从那里阅读 Microsoft API 文档来弄清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多