4

同期する 2 つのプロセスがあります。

プロセス A はルートとして実行され、特定のファイルに再入可能ロックを作成します。プロセス B は「通常の」ユーザーの下で実行されており、プロセス A によってロックが解除されるのを待つ必要があります。

多くの方法を試しましたが、ファイルのアクセス許可が間違っているため、機能しません。コードは次のとおりです: (in-VM-synchronisation-stuff を削除):

ロック:

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 に umask しようとしましたが、これは無視されているようです。最初に setWritable(true, false) というファイルを作成しようとしましたが、これはリセットされているようです。動作する方法がありませんでした。hasLock で「rw」モードではなく「r」モードを使用しようとしましたが、ChannelNotWritableException が発生します。

したがって、主な質問は次のとおりです。作成されたロックファイルのアクセス許可にどのように影響を与えることができますか?

誰か提案がありますか?

よろしくマイケル

4

2 に答える 2

2

最後に私は解決策を得ました:

最初にファイルを作成する方法は正しいものでした。私が犯した間違いは、ファイルの作成前にアクセス許可を設定したことです (アクセス許可がファイル オブジェクトに格納され、作成時に使用されることを期待しています)。最初にファイルを作成し、次に権限をすべてに設定してからロックする必要があります。

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

現在、ロックファイルは世界的に書き込み可能で作成されています (これはセキュリティ上の問題である可能性がありますが、ファイルにはコンテンツが含まれていないため、実際には目に見える問題はありません。

解決策を見つけるのを手伝ってくれたみんなに感謝します!

よろしくマイケル

于 2012-05-08T17:21:47.843 に答える