Невозможно удалить именованный канал из 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);
Труба все еще создана, и это нормально. Я также попытался удалить канал менее нативным способом Java, через exec
:
final String [] rmfifo = { "/bin/rm ~/myFifo" };
Runtime.getRuntime().exec(rmfifo);
Ни один из них, кажется, не работает. Есть идеи?
Спасибо, erip
1 ответ
Проблема заключается в ~/myFifo
,
Ява не понимает ~
Я запустил следующий код.
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
вещь, так что Ява не поднимет его.
Причина, по которой он на самом деле создает файл, в том, что вы используете /bin/sh
запустить mkfifo
команда и sh
переводит ~/
,