从两个进程

时间:2017-04-10 09:02:21

标签: java linux filesystems nio

你有:

打开文本文件(TEXTFILE)的进程(READER),读取所有行直到EOF并等待出现新行。

READER用Java实现,等待部分使用java.nio.file.WatchService,如果我在Linux上正确理解使用inotify。我不确定哪个与问题更相关。 实现非常简单(为了简洁起见,异常处理和一些if):

 WatchService watcher;
 watcher = FileSystems.getDefault().newWatchService();
 Path logFolder = Paths.get("/p/a/t/h");
 logFolder.register(watcher, ENTRY_MODIFY);

 reader = Files.newBufferedReader("TEXTFILE", Charset.forName("US-ASCII"));
 key = watchService.take();

 for (WatchEvent<?> event : key.pollEvents()) {
     WatchEvent.Kind<?> kind = event.kind();

     doSomethingWithTheNewLine(reader.readLine());
 }

现在,如果我运行READER和

  1. 在编辑器中打开TEXTFILE,添加一行并保存,结果是READER似乎没有获得新行

  2. 另一方面,如果我在bash

  3. 中执行此类操作

    while true; do echo $(date) ; sleep 2; done >> TEXTFILE

    然后READER确实得到了新的行

    修改 据我所知,这里可能重要的区别在于,在第一种情况下,编辑器加载文件的内容,关闭它(我假设),并在保存时再次打开文件并同步内容与文件系统,而bash行保持文件打开...如何有所作为,我不确定

    我想简单的问题是为什么???

    我理解这样的情况是,当&gt; 1进程需要同时访问文件系统上的同一文件时,Linux正在使用某种锁定。我还认为当进程 A 在时间t0向文件打开文件描述符时,它会让我们说一个文件内容在t0处的快照。即使进程 A 没有关闭文件描述符(这里似乎就是这种情况),并且进程 B 在某些文件中附加到该文件t0 + delta,然后进程 A 必须重新打开文件描述符才能看到更改,它不能保存到相同的文件描述符并将新数据附加到该文件中...虽然很明显是什么我观察到这种假设是矛盾的......

0 个答案:

没有答案