管道文件消失但仍然有效

时间:2010-01-15 12:36:05

标签: java unix pipe

我有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);,除了从管道A收到的进程消息之外没有做任何事情。

编辑:

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

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 个答案:

答案 0 :(得分:3)

我无法回答为什么管道文件被删除,而没有足够的信息。

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

答案 1 :(得分:0)

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