• ベストアンサー

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

alfeimの回答

  • ベストアンサー
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.2

>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
質問者

お礼

>>3.無ければfileA.lockを作成し、 >の部分はちゃんと排他制御してやる必要があります やはりSynchro使わないとできないですか......。 でもファイルにアクセスしている部分をすべて排他にするよりはよさそうですね。 ありがとうございます。 権限のほうは、UNIXにサーブレットエンジンいれさせてもらって、 確かめてみました。 (それでこんなに時間かかりました。ごめんなさい) ps auxとしたらそのようなオプションないらしかったのですが、 ps -Afとか教えてもらってなんとかプロセスを表示してみたところ、 nobodyとかになっていました。(誰?) Unixは私にはやはり難しいです。 後半はよくわからなかったので、 「権限」というものについてもっと勉強してから出なおしてきます。 たびたび申し訳ありません。本当にありがとうございます。

関連するQ&A

  • file()を使う時のファイルロック

    たいていの場合は問題ないのですが、 アクセスカウンタ等の更新の激しい物の場合、 file()やfile_get_contents()でファイルを開き、 その内容を元にfopen()・flock()・fputs()等を使って書き込むと、 データが破損してしまう事があります。 これはロック中でもfile()等では開けてしまうのが原因だと思いますが、 file()等を使う際の排他処理はどのようにしたら良いのでしょうか。 ロック中は、fopen()の前で解放されるのを待つ仕様なようなので、 $fp=fopen("ロック用ファイル","r"); flock($fp,LOCK_EX); ~複数のファイルの読み書きを含めた、様々な処理~ fclose($fp); としてみたのですが、これで排他処理は完璧になるでしょうか? これまでは、 1. ロック用ファイルが存在する場合、なくなるまでsleep() 2. 空のロック用ファイルを作成 ~複数のファイルの読み書きを含めた、様々な処理~ 3. ロック用ファイルを削除 としていたのですが、これでは度々破損してしまいました。 「1」と「2」の間で、新しいプロセスが「1」に割り込んで来てしまうせいでしょうか。 そうだとすれば、fopen()とflock()の間でも 同じ事が起きてしまう気がするのですが、どうなんでしょうか。

    • 締切済み
    • PHP
  • テキストファイルのロックを行ないたい

    現在Win2003サーバにて環境を構築しております。 4台のノード(XP)からサーバにアクセスできるようになっています。 複数のPCで同時にログインを行った場合に、共有フォルダに 存在するテキストファイルを同時に開けないようロックを かけたいのですが、メモ帳などで作成したテキストファイルを ロックするための方法がわからず困っています。 どなたか良い方法をご存知でしたら教えてください。 よろしくお願いします。

  • Access2003 テーブルロック

    Access2003で任意のテーブルをロックすることはできますでしょうか? 1.ユーザAがテーブル1にアクセスしにいき、テーブル1をロック 2.ユーザAは処理が終了したらテーブル1のロックを解除 1~2の処理の間はユーザA以外のユーザがテーブル1にアクセスできないようにしたいのです。 ロックファイルを使用するやり方もあると思いますが なるべく簡単に実現したいので、 なるべくロックファイルやアプリケーション変数は使いたくありません。 (サーバーが落ちた場合に永久にロックされてしまうので) 何かよい方法をご存知の方がいらしたらご教授お願いします。

  • ファイルロックについて

    現在商品管理システムを自作してみようと頑張ってるところなのですが、ファイルロックで躓いてしまいました。flock()を使ってみたのですが同時に複数の処理(データの更新と書き込みを同時に行った場合等)が行われるとデータが消えてしまったりします。 皆様はどういった形でファイルロックをしてますか? これは安全だ! というようなロックってのはあるんでしょうか?

    • 締切済み
    • CGI
  • ASPでMDBファイルを更新する時のロックについて

    こんばんは ASP(VBスクリプト)で MDBファイル(アクセス2000)の データベースを 更新 又は レコード追加 をさせるときの ロックについて悩んでいます。 まず条件として このMDBファイルは 複数のユーザーが共有する物です。 (ここでは仮に A B C と3つのユーザーとします) データの新規登録の時(レコードの追加)はレコード内の項目で 絶対重複しないIDを発行して登録します。 逆に更新の時は そのIDを基に該当レコードを更新します。 また、IDはA*** B*** C*** と言うように 各ユーザーの固有ID+重複しない番号 と言う内容にしています 二重書き込み防止のために色々考えているのですが このIDを基にした方法だと 基本的にはAというユーザーが 同じIDの情報を複数のブラウザ開かない限り二重書き込みには ならないと思っています。 (変更登録などはパスワードで管理して物理的に1人(1画面)しかできないようにしています) なので物理的な2重書き込みはこれで防止できると思っているのですが 正しいでしょうか? ただ、ものすごく悩んでいるのが 1人が1つのデータベースをさわっているのなら良いのですが 複数人が同時に使っている場合、レコードが服従することはないので 2重書き込みはないとしても Aのデータを更新しているときに Bが新しく情報を追加したと言うような 事は起こるはずなので、ファイルが壊れないかと心配しています。 なので cgiで言うような書き込みロックのような事が ASPでもできるのかなと思っています。 ただ、それ以前に こういった使い方はダメでしょうか? (1つを複数人で使うこと) 良くない場合は A、B、C それぞれデータベースを作り それを結合させた方が賢明なのかなとも思っています。 ロックの方法でやるか 個々に作って結合させるか それ以外にもよい方法があるのか これで悩んでします。 また、ロックの場合 Updateではなく Recordsetオブジェクトを使って IDがあれば更新 なければ 追加 と言う方法にしようと 思っていまして その場合 OPENメソッド recordset.Open Source, ActiveConnection, CursorType, LockType, Options で、ロックタイプを3にしても これはUpdateの時だけ有効のようなので 意味がないのかなと思っています ただ MSのHPでの解説で >>レコード単位の共有的ロックを示します。Update メソッドを呼び出した場合にのみ、プロバイダは共有的ロックを使ってレコードをロックします。 と書いているのですが、そもそも >>共有的ロックを使ってレコードをロック と言う意味が分かっていません ファイルを壊さないためにも有効であるなら Updateを使う方法に変えようかとも思うのですが、どうなんでしょうか? なんか 基礎的なことが分かっていないので 分かりにくい質問になりましたが ファイルが壊れないような処理方法を作っていきたいので、ご教授のほど よろしくお願いします。

  • 「○○○.ldb」のAccess レコード ロック情報←このファイルが消えません

    windows-nt、officeはAccess2003です。 Access97から2003に変換したファイルを、なんら問題なく、半年使っていました。 メンテナンスは「shift+enter」の排他モードで開き、度々行っていました。 ですが突然いつものように、メンテをして閉じたのですが、「Access レコード ロック情報」のファイルが消えません。 ファイルを全て閉じても、このファイルのユーザーが自分になったままになっています。 レコードロック情報のファイルを消したいのですが、どうしたらよいでしょうか?? もぅ、ギブアップです・・・ 説明がうまくなくて、申し訳ありませんが、どなかた解決して頂けたらと思います。 宜しくお願い致します!!

  • データー登録、更新時のファイルロックは必要なのでしょうか?

    PHPとMySQLを組み合わせて、簡単なデーターベースを作っています。 非公開で、それほど多くの人がアクセスするわけではないのですが、同時使用もありえる状況で新規書込みと内容の更新などが同時に発生する状況も考えられます。 通常のphpのシステムとかですと、ファイルロックについて、いろいろと書かれているのですが、MySQLシステムでファイルロックについて(テーブルロック?)探してもよくわからないのです。 だれかがinsertやupdateしていると、自動的に排他状態になったりしているのでしょうか?

  • PHPのシンクロ処理

    JAVAにはsynchronized メソッドがあり、メソッドの排他制御がありますが、 PHPにはあるのでしょうか? もしないとすれば、変数などが同時アクセスの場合、 予期せぬ値に変わってしまうため、どのように処理をすればよろしいでしょうか。 ご教授お願い申し上げます。

    • 締切済み
    • PHP
  • AccessVBA:読込専用ファイルを開きたい

    いつもお世話になっております。 Access2000を使用しております。 自MDBから別のMDBファイルのアクセスを行う際に OpenDatabaseメソッドを使用しているのですが、 対象のMDBファイルが読込専用である場合に 以下のエラーが発生してしまいます。 エラーコード   :3051 エラーメッセージ ::ファイル 'C:\***.MDB' を開くことができませんでした。ほかのユーザーが排他的に開いているか、データを読み取る権限がありません。 MDBファイルは書き込みを行いたいということではなく、テーブル名を参照したいだけなので、 読込専用のファイルでもアクセスしたいのですが、 Set db = OpenDatabase(fl, , True) といったように第3引数read-onlyの引数をTrueにしても同様のエラーが発生してしまいます。 読込専用のファイルは開くことが出来ないのでしょうか? ご教示の程、何卒よろしくお願いいたします。

  • ファイルロックについて

    こんばんわ、お世話になります。 Perlのファイルロックについて教えて下さい。 色々書き方があるようなのですが、私は下記のように 単純に書いています。 #// ファイルロック開始 flock(LOCK, 2); #// ファイルオープン open(LOG, ">>$data") or exit; #// ファイルへ書き出し print LOG "$now,$ip,$ls\n"; #// ファイルクローズ close(LOG); #// ファイルロック解除 flock(LOCK, 8); 原因かわからないのですが、アクセスが多数同時にあると 10分くらいレスが返ってこなくなったりすることがあるようです。 ファイルロックに精度とかあったりすのでしょうか? 単純に、コードが1500行くらい書いているので、やっている処理自体 重いのかもしれませんが、1アクセスの場合は問題なく返ってくるので どうなのかな…と思い、投稿しました。 論理ファイル(CSV)を呼んで、中のデータを絞り込んでいき その結果をPOSTするいったこと(100ファイル分くらい)をやって います。 ファイルロックによって、パフォーマンスが悪くなったりするのか、 どなたかご教授ください。お願いします。

    • ベストアンサー
    • Perl