Файл трубы исчезает, но все еще работает - PullRequest
1 голос
/ 15 января 2010

У меня есть 2 программы, обе написаны на Java. Первый запускает несколько экземпляров второго, а затем связывается с ними через файлы каналов. При запуске 2 экземпляров программы (я назову модуль запуска A и остальные B и C) все работает нормально. Файлы канала находятся в / tmp / [pid of A] / B и / tmp [pid of A] / C. Если B или C закрываются, другие должны продолжать работать, что и происходит, за исключением того, что вся папка / tmp / [pid of A] исчезает.

Другая программа обнаруживает это и пытается закрыть себя, потому что это не должно работать без файлов канала.

Мои вопросы: почему он продолжает работать, если файлы каналов пропали? и почему они вообще исчезают?

Если C закрывается, то A и B продолжают работать. Единственный код, который выполняется, это System.exit(0);, и кроме сообщений о процессах, полученных из каналов А, ничего не делает.

EDIT:

По запросу код, который создает каталог и каналы.

File dir = new File("/tmp/" + pid);
dir.mkdirs();

File aDir = new File(dir, "A");
aDir.mkdirs();

File bDir = new File(dir, "B");
bDir.mkdirs();

Runtime.getRuntime().exec(new String[] {"mkfifo", PIPE_NAME}, null, aDir);
Runtime.getRuntime().exec(new String[] {"mkfifo", PIPE_NAME}, null, bDir);

Фактический код немного сложнее, но это основная идея.

Когда программа закрывается.

frame.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
});

Чтение и запись потоков выполняется в собственном потоке, обрабатывая его как обычный файл с использованием объектов BufferedReader и BufferedWriter.

Ответы [ 2 ]

3 голосов
/ 15 января 2010

Не могу ответить, почему удален файл канала, недостаточно информации.

Я могу ответить, почему программа все еще работает. В Unix удаление имени файла из каталога не удаляет файл. Файл удаляется только тогда, когда в каталоге больше нет записей и файл не используется программой.

0 голосов
/ 15 января 2010

В Unix ядро ​​хранит счетчик ссылок для всех открытых файлов - если вы открываете файл, этот счетчик ссылок увеличивается, а когда вы закрываете этот файл, он уменьшается. Файловая структура в ядре остается действительной до тех пор, пока счетчик ссылок не упадет до 0. Удаление канала из файловой системы не позволяет новым процессам открывать файл, но процессы, у которых уже открыт файл, могут продолжать его использовать, независимо от удаления файлов. .

...