-PR-
解決済み

ファイルをロックするには

  • すぐに回答を!
  • 質問No.46381
  • 閲覧数848
  • ありがとう数5
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 86% (13/15)

現在Servletでファイルの書き込み、
または読み込みをするシステムを作ろうとしています。
同時に複数ユーザが同一ファイルにアクセスするのを
防ぐためにファイルをロックしたいと思っています。
Javaではファイルをロックするのに使うメソッドは
ないと聞いたのですが、
実際にはどうしたら良いのでしょうか…。
できればサンプルのようなものがあると
イメージが沸くので嬉しいのですが、
なければ「こうすれば実現できる」という方法だけでも
ご存知でしたら教えていただけないでしょうか。

なお、syncronizedを使って
ファイルアクセスするメソッドを排他にする方法は
使いたくありません。
ユーザAはファイル1、ファイル2、ファイル3を…。
ユーザBはファイル3、ファイル4、ファイル5を…、
といったように、一人のユーザも
ほぼ同時に複数ファイルアクセスするので、
ロックしたいのは同じファイルだった場合のみ
(しかもファイル名も動的に決まる)
だからです。

もうしわけありません。
お力を貸していただけないでしょうか。
よろしくお願い致します。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.2
レベル11

ベストアンサー率 58% (114/195)

>3.無ければfileA.lockを作成し、

の部分はちゃんと排他制御してやる必要があります
たしかJavaにはそのメソッドに同時に一つのプロセスしか実行を許さない修飾子がありましたよね?(synchronizedでしたっけ?、あまりJavaは詳しくないもので(^^;)
排他制御する時間自体は高々ファイルオープンと条件分岐数回程度なので一瞬ですのでパフォーマンスの問題にはならないと思います

>servletの権限はservletEngineを起動したユーザの
>権限なのかと思っていたのですが、違うのでしょうか。

ごめんなさい。私もservletがどのように動いているのかあまり詳しくないので、憶測入れながらになりますが・・・

動きとしてはHTTP daemon -> servlet engineという呼び出しがされるみたいなので(自信ありません(^^;詳しい方に聞いて確かめてください)たぶん、www-dataやdaemonなどのuserになっていると思います。
サーバがUNIXであるのであればloginして
ps aux | grep apache
(apacheの部分はそちらのサーバで動いてるHTTP daemonに変えてください)とすれば左端にそのプログラムの動作しているユーザ権限が表示されているはずです

・・・あ、Windows98ですか・・・
Windows98であればサービスとしてプロセスを動かす方法はなかったはずですので通常、servletのユーザ権限はたちあげたユーザとなると思います(というか、Windows9xだとNetwork向こうからのユーザに対する設定は出来たけど、ローカルマシンユーザに対する設定はなかったかも・・・、という訳で気にする必要はないかもしれません)

また、UNIX、Windows(他のどのOSにも限りませんが)servlet(Java)に現在ログインしているユーザを知る方法があるのであれば、それをHTMLなどと一緒に出してやれば現在のユーザは誰かは分かると思います
お礼コメント
tontoto

お礼率 86% (13/15)

>>3.無ければfileA.lockを作成し、
>の部分はちゃんと排他制御してやる必要があります

やはりSynchro使わないとできないですか......。
でもファイルにアクセスしている部分をすべて排他にするよりはよさそうですね。
ありがとうございます。

権限のほうは、UNIXにサーブレットエンジンいれさせてもらって、
確かめてみました。
(それでこんなに時間かかりました。ごめんなさい)

ps auxとしたらそのようなオプションないらしかったのですが、
ps -Afとか教えてもらってなんとかプロセスを表示してみたところ、
nobodyとかになっていました。(誰?)
Unixは私にはやはり難しいです。

後半はよくわからなかったので、
「権限」というものについてもっと勉強してから出なおしてきます。
たびたび申し訳ありません。本当にありがとうございます。
投稿日時 - 2001-03-02 21:24:26
関連するQ&A
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.3
レベル10

ベストアンサー率 37% (64/169)

私なら違うアプローチをします。 ロック・アンロックをプログラマが実装するのは面倒くさいので、私ならそういうものはデータベースに格納します。 データベースにロック・アンロックをまかせてしまえば 簡単です。 Javaとデータベースというのは相性がいい(使いやすい) ので、簡単に実現できます。
私なら違うアプローチをします。

ロック・アンロックをプログラマが実装するのは面倒くさいので、私ならそういうものはデータベースに格納します。
データベースにロック・アンロックをまかせてしまえば
簡単です。
Javaとデータベースというのは相性がいい(使いやすい)
ので、簡単に実現できます。


  • 回答No.1
レベル11

ベストアンサー率 58% (114/195)

よく使われる手法としては開くファイル名に決まったprefixとsuffixを付けたファイルをsize 0のlock fileとして生成する手段がよく使われます まず、ファイルを開く前にlockファイルを生成し、その後で本来開くファイルをopenします ファイルが既にある場合はopenメソッドが失敗するようにしておけばシステムのfile lockの代わりに使えると思います このlockファイルを作 ...続きを読む
よく使われる手法としては開くファイル名に決まったprefixとsuffixを付けたファイルをsize 0のlock fileとして生成する手段がよく使われます

まず、ファイルを開く前にlockファイルを生成し、その後で本来開くファイルをopenします
ファイルが既にある場合はopenメソッドが失敗するようにしておけばシステムのfile lockの代わりに使えると思います
このlockファイルを作るメソッドをcritical sectionにしておけば、上手く行くと思います

この方法の場合、servletで書き込み権限があるディレクトリが必要なので注意してください
お礼コメント
tontoto

お礼率 86% (13/15)

ありがとうございます。
1.fileAにアクセスしたいとき
2.まずfileA.lockファイルがないか確認し、
3.無ければfileA.lockを作成し、
4.fileA読みこみ/書きこみ作業を行い
5.file処理が終了したらfileA.lockを削除
とすれば…上手く行きそうですね!
あ…3を同時に行おうとすればどうなるのでしょうか…。
あきらめるしかないのでしょうか…。

ところで、申し訳ありません、
>この方法の場合、servletで書き込み権限がある
>ディレクトリが必要なので注意してください
という注意が気になってしまいました。

servletの権限はservletEngineを起動したユーザの
権限なのかと思っていたのですが、違うのでしょうか。
rootとかAdministratorでservletEngineをインストール
すると、どこにでもかけるのかと…。
(今の環境がwin98なので権限とかの概念がよくわからないのですが…)
そうではなくて、Servletにアクセスした人の権限
(guest?とか…?)なのでしょうか。
それともservletは独自の権限を持っている…のでしょうか…。

とりあえず、Servletの下にフォルダ作成すれば大丈夫かな…とおもっているのですが…。

権限を調べる(Servletの…?)方法があるのでしょうか。
重ね重ね申し訳ありません。
もしご存知でしたら調べ方(?)の手がかりでも教えていただけないでしょうか。
投稿日時 - 2001-03-01 18:44:11
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ