Java 管道文件消失但仍然有效

Java 管道文件消失但仍然有效,java,unix,pipe,Java,Unix,Pipe,我有两个程序,都是用Java编写的。第一个启动第二个的多个实例,然后通过管道文件与它们通信。当运行程序的两个实例时,(我将调用启动器A和其他的B和C),一切正常。管道文件位于/tmp/[pid of A]/B和/tmp[pid of A]/C中。如果B或C关闭,则其他文件应继续工作,除了整个/tmp/[pid of A]文件夹消失外,其他文件都会继续工作 另一个程序检测到这一点,并尝试关闭自己,因为没有管道文件它不应该工作 我的问题是,如果管道文件消失了,为什么它还能继续工作?为什么它们一开始就

我有两个程序,都是用Java编写的。第一个启动第二个的多个实例,然后通过管道文件与它们通信。当运行程序的两个实例时,(我将调用启动器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)
编辑:

根据请求创建目录和管道的代码

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对象将其视为普通文件。

我无法回答管道文件被删除的原因,因为没有足够的信息


我可以回答为什么这个程序仍然有效。在unix中,从目录中删除文件名不会删除该文件。只有当不再存在目录条目且程序未使用该文件时,才会删除该文件。

在unix中,内核会在所有打开的文件上保留引用计数-如果打开文件,则该引用计数会增加,而当关闭该文件时,该引用计数会减少。内核中的文件结构在引用计数降至0之前保持有效。从文件系统中删除管道会阻止新进程打开该文件,但已打开该文件的进程可以继续使用它,而不受文件删除的影响。

您应该发布一些关于如何创建临时文件和“[pid of a]”目录的代码。您需要发布代码。你说的“管道文件”是什么意思?按照您描述它们的方式,您没有使用shell管道或操作系统管道。显示创建这些文件所用的确切代码,以及在B或C关闭时运行的确切代码。我只是想检查一下C关闭时A没有做任何事情。我在调试器中运行了A,在启动B和C之后,暂停了A中所有正在运行的线程,然后关闭了C。发生了同样的事情。就删除而言,它必须在代码中的某个地方。您可以使用OS命令创建管道,这样它们就不会绑定到JVM执行。我建议对“delete”和“rm”进行grepping。找到它后,有一个关闭钩子隐藏起来,删除了所有内容。我现在觉得自己很愚蠢。尽管如此,我知道为什么在它们被删除后它还能工作,所以不是完全的浪费。