Невозможно удалить именованный канал из 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 переводит ~/,

Другие вопросы по тегам