首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaNIO:检查根用户在普通用户下运行的进程中创建的文件锁?

JavaNIO:检查根用户在普通用户下运行的进程中创建的文件锁?
EN

Stack Overflow用户
提问于 2012-05-08 04:06:49
回答 2查看 1.9K关注 0票数 4

我有两个要同步的进程。

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

我尝试了许多方法,但由于错误的文件权限,无法使其正常工作。下面是代码:(去掉了in-VM-synchronisation stuff):

锁定:

代码语言:javascript
复制
FileChannel channel = new RandomAccessFile(pFile, "rw").getChannel();
lock = channel.tryLock();

hasLock:

代码语言:javascript
复制
RandomAccessFile file = new RandomAccessFile(pFile, "rw");
FileChannel channel = file.getChannel();
FileLock lock = channel.tryLock();
if (lock == null) {
 return true;
}
lock.release();

我遇到的问题是锁是这样创建的:

代码语言:javascript
复制
-rw-r--r--. 1 root root 0 May  7 21:42 lockfile.lock

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

代码语言:javascript
复制
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。

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

有人有什么建议吗?

向Michael致敬

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-09 01:21:48

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

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

代码语言:javascript
复制
file.createNewFile();
file.setWritable(true, false);
FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
channel.tryLock()

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

感谢所有帮助我找到解决方案的人!

向Michael致敬

票数 2
EN

Stack Overflow用户

发布于 2012-05-08 09:12:10

您面对的是根进程的umask,它屏蔽了您在创建文件时提供的"rw“,以拒绝对groupothers的写访问。除了更改根目录的umask之外,您对此无能为力,因为出于安全原因,这是一个非常糟糕的想法。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10488391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档