无法从 Java 中删除命名管道

Cannot delete a named pipe from Java

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

None 其中似乎有效。有什么想法吗?

谢谢, 埃里普

问题是~/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 t运行列出 ~/.