4

我有两个要同步的进程。

进程 A 以 root 身份运行并在特定文件上创建可重入锁。进程 B 在“普通”用户下运行,应该等待进程 A 释放锁。

我尝试了很多方法,但由于文件权限错误而无法使其正常工作。这是代码:(删除了虚拟机同步的东西):

锁:

FileChannel channel = new RandomAccessFile(pFile, "rw").getChannel();
lock = channel.tryLock();

有锁:

RandomAccessFile file = new RandomAccessFile(pFile, "rw");
FileChannel channel = file.getChannel();
FileLock lock = channel.tryLock();
if (lock == null) {
 return true;
}
lock.release();

我遇到的问题是锁被创建为:

-rw-r--r--. 1 root root 0 May  7 21:42 lockfile.lock

如果我尝试检查锁(通过以普通用户身份运行的进程 B)我得到一个

java.io.FileNotFoundException: _lockfile_ (Permission denied)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:212)

我试图将目录隐藏到所有 g=rwx,o=rwx 但这似乎被忽略了。我尝试先创建文件 setWritable(true, false) 但这似乎已重置。我没有任何方法可以工作。我尝试在 hasLock 中使用模式“r”而不是“rw”,但这会导致 ChannelNotWritableException。

所以主要问题是:如何影响创建的锁文件的权限?

有人有什么建议吗?

问候迈克尔

4

2 回答 2

3

您面对的是根进程,它掩盖了您在创建文件时提供的“rw”以拒绝对andumask的写访问。除了更改根目录之外,您无能为力,出于安全原因,这是一个非常糟糕的主意。groupothersumask

您应该考虑让锁定文件永久存在,或者像 Peter 建议的那样,使用已经是应用程序一部分的文件作为锁定文件。

于 2012-05-08T01:12:09.920 回答
2

最后我得到了一个解决方案:

首先创建文件的方式是正确的。我犯的错误是我在创建文件之前设置了权限(期望权限存储在文件对象中并在创建时使用)。我必须先创建文件,然后将权限设置为 all 然后锁定它:

file.createNewFile();
file.setWritable(true, false);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
channel.tryLock()

锁定文件现在使用 worlwide-writable 创建(这可能是一个安全问题,但实际上没有可见问题,因为该文件不包含任何内容。

感谢大家帮助我找到解决方案!

问候迈克尔

于 2012-05-08T17:21:47.843 回答