【问题标题】:Cannot delete a named pipe from Java无法从 Java 中删除命名管道
【发布时间】:2015-07-15 12:53:23
【问题描述】:

我正在用 Java 创建一个命名管道,它使用以下代码:

final String [] mkfifo = {"/bin/sh", "-c", "mkfifo ~/myFifo && tail -f ~/myFifo | csh -s"};

Process p = Runtime.getRuntime().exec(mkfifo);

但现在当我尝试使用以下代码将其删除时,我得到了 NoSuchFileException

Path fifoPath = Paths.get("~/myFifo");

try {
    Files.delete(fifoPath);
} catch (Exception e) {
    System.err.println(e);
}

我已验证该文件确实是在程序执行期间通过发出ls ~ 创建的,并且在抛出异常并且程序执行结束后~/myFifo 仍然存在。

我认为... && tail ... 可能会在它以某种方式阻塞的情况下导致一些问题,所以我更改为使用以下方法创建命名管道:

final String [] mkfifo = {"/bin/sh", "-c", "mkfifo ~/myFifo"};

Process p = Runtime.getRuntime().exec(mkfifo);

管道仍然被创建,这很好。我还尝试通过 exec 以非原生 Java 方式删除管道:

final String [] rmfifo = { "/bin/rm ~/myFifo" };

Runtime.getRuntime().exec(rmfifo);

这些似乎都不起作用。有什么想法吗?

谢谢, erip

【问题讨论】:

  • 你能显示正在抛出的错误吗?
  • java.nio.file.NoSuchFileException: ~/myFifo

标签: java named-pipes nosuchfileexception


【解决方案1】:

问题是~/myFifo

Java 不理解 ~

我运行了以下代码。

Path fifoPath = Paths.get("/home/russell/myFifo");
try {
    Files.delete(fifoPath);
} catch (Exception ex) {
    System.err.println(ex);
}

它运行完美。

String home = System.getProperty("user.home");
Path fifoPath = Paths.get(home + "/myFifo");
try {
    Files.delete(fifoPath);
} catch (Exception ex) {
    System.err.println(ex);
}

上面的代码也适用于我的系统。

~/shell 的东西,所以 java 不会接受它。

它实际上首先创建文件的原因是因为您使用/bin/sh 运行mkfifo 命令,而sh 翻译~/

【讨论】:

  • 这行得通。遇到其他一些问题,但这无关紧要。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多