我正在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
。 / p>
我认为... && tail ...
可能会导致一些问题,以防它以某种方式阻塞,所以我做了更改以创建命名管道:
final String [] mkfifo = {"/bin/sh", "-c", "mkfifo ~/myFifo"};
Process p = Runtime.getRuntime().exec(mkfifo);
仍然创建了管道,这很好。我还尝试通过exec
:
final String [] rmfifo = { "/bin/rm ~/myFifo" };
Runtime.getRuntime().exec(rmfifo);
这些似乎都不起作用。有什么想法吗?
谢谢, erip
答案 0 :(得分: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
会翻译~/
。< / p>