1

我正在用 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);

管道仍然被创建,这很好。我还尝试通过以下方式以不那么原生的 Java 方式删除管道exec

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

Runtime.getRuntime().exec(rmfifo);

这些似乎都不起作用。有任何想法吗?

谢谢,埃里普

4

1 回答 1

3

问题是~/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翻译~/.

于 2015-07-15T13:04:30.777 回答