• ベストアンサー

unixでのファイルロックの方法教えてください

 unixでファイルロックを試みているのですが、うまくいきません。open関数で得たファイル指定子にlockfを用いてみたのですがうまくいきません。ロックはされているようなのですが、他からファイルに書き込みができてしまうのです。  flockやO_EXLOCKなどは、使えないのです。誰か、「こうすればいい!」といえる方、教えてください。

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

下記ページが非常に参考になると思います。 ご一読ください。

参考URL:
http://tohoho.wakusei.ne.jp/wwwcgi8.htm, http://www.din.or.jp/~ohzaki/perl.htm#File_Lock

その他の回答 (2)

回答No.2

僕も同じ事で悩んだことがあるのですが、他の書き込もうとするプロセスはlockfを使っていますか? どうやらlockf等の関数は書きこみ自体を禁止にするのではなく排他制御のためのお約束みたいなもので、無視してしまえば当然のごとく?書込みできてしまうのではないかと思っています。・・・はっきりいって自信ありません。 便乗になってしまいますが、詳しい方いらしたら正確な事を教えて頂けないでしょうか?

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

unixにおけるファイルロックはいくつかの種類があり、互換性はありません。 lockf(3):Posix.1準拠 flock(2):BSD準拠 fcntl(2):F_GETLKフラグはSVr4, SVID, POSIX, X/OPEN, BSD 4.3. Posix.1(ただし、仕様の記述があるだけで機能するという保証は無い) 御利用のUNIXはどの仕様に準拠しているのか教えて下さい。

GANDI
質問者

補足

私が使っているunixの仕様はよく分からないのですが HP-UX(ヒューレット・パッカード社の開発) で、BSDよりはSVr5に近い?という話です。 これで何かわかりましたら、お手数ですが もう一度お願いします。

関連するQ&A

  • ロック??

    データファイルとかは同時書き込みされると破損するみたいですね。 それを防ぐにはとうすりゃいんだ?と思い書籍(十日でおぼえるPerl講座)をみるとFlock関数を使えばいいとありました。 しかし自分が使っているスクリプトのロック関数は MkdirとSymlinkだけです。 これはどうすればいいんでしょうか?

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

    こんばんわ、お世話になります。 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
  • open中のファイルをrename

    オープン中のファイルをflockによる排他をしたままrenameしたいのですがどうもうまくいきません。 sysopen(LOCK, "$file", O_WRONLY);   もしくは open(LOCK, "> $file"); flock(LOCK, 2); rename($tempfile,$file); close; close前にrenameするとロックが外れてしまいます。 close後にrenameをするとやはりロックが外れた状態でのrenameになります。 renameするファイル以外にflock専用ファイルを固定で一つ用意すれば簡単なのですが openしたいファイル数は相当な数があり、各ファイルごとにロックをかけたいのです。 全ファイル分のflock専用ファイルを用意するか、排他方式をmkdirにする以外 何か良い手立てはございますでしょうか。

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

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

    • 締切済み
    • CGI
  • ファイルのロックについて

    ファイルのロック方法を下記の様にしてロックさせていますが、同時ににアクセスが合ったときにどちらかが$add_text;を書きこまれないので順次書き込まれる様にしたいのですが、何方かご教授してもらえませんか? #!/usr/bin/perl use Fcntl ':flock'; open(ADD_DB,">>$log"); flock(ADD_DB, LOCK_EX); print ADD_DB "$add_text;\n"; flock(ADD_DB, LOCK_NB); close(ADD_DB);

    • ベストアンサー
    • Perl
  • ロックしたディレクトリが消えない(?)

    flock関数を使い、 $lockfile="./lock/lock.loc"; sub lock { foreach $i (1..6) { . . . if(open(LOCK,">$lockfile")){ if (flock(LOCK,6)) { $lock_flag = 1; last ; } } . . . } } という風にし、メインルーチンで&lockを実行し、ファイルロックしたのですが、flock(LOCK, 8)を使い忘れ、あとでFFFTPを使ってこれを消そうとしても、なにやらディレクトリが永遠に続いている感じになってしまい消せません。 /lock/lock.loc/lock.loc/lock.loc/lock.loc/lock.loc/... という風になっています。 それと元からlock/lock.locというディレクトリが存在したままflockを使ってしまったかどうかはちょっと確認していなかったのですが、使う前にあったとしたらlock.locはファイルではなく、ディレクトリです。 (mrdirを使ったロックなどをいろいろ試していたためです。) うまく説明できなかったのですが、どうすればこれは消せますか?後でflock(LOCK, 8)をやっても直りません・・ アップしたサーバーは@niftyです

    • ベストアンサー
    • Perl
  • Perlでロック不具合?

    Perlを使用して、掲示板のようなものをつくり、ずっと稼動させていましたが、 今日、データが消えてしまいました。 データのファイルサイズがゼロになっていました。 ファイルの書込み時には、flockを使用してロックをかけています。 #--ロック flock LOCK,2; #--アンロック flock LOCK,8; どのような原因が考えられますでしょうか? flockが使用できることは、別途スクリプトを作って確認済みです。 環境 SuSE linux 9 Perl v5.8.3 書込みが最大で1日に30件程度 宜しくお願いします。

    • ベストアンサー
    • Perl
  • phpのlock処理について

    phpのlock処理について 頻繁に書き込みされるファイルが飛ばないようにロックをしているのですが、 (アクセスログを保存) phpのロック処理を調べていると 一方ではこれでよい、もう一方ではこれでは意味がないなど 色々な事が書かれており、いまいち理解できません。 wモードで開くと強固なロックは不可能なのでしょうか。 以下のようにしているのですが ロックの意味はないでしょうか。 //ロック専用ファイルを開く $flock=fopen("lock.txt","w"); //ロック専用ファイルをロック flock($flock,LOCK_EX); //書き込むファイルを連結して代入 $lineall = implode('', $lines); //書き込み用のファイルを開く $fp=fopen($log_file,"w"); fwrite($fp, $lineall); fclose($fp); //ロック用ファイルのロック解除 flock($flock, LOCK_UN); fclose($flock); プログラムが1から私が作成したものではなく、 ちょくちょく消えてしまうことからロック処理をしたいのと 処理の問題でwモードでの書き込みでないとどうもゴミが入ってしまうようですので (r+でやってみましたが空行などのゴミが沢山入ってしまいました) wモードでの強固なロック方法があればと思うのですが・・・。 お手数をおかけしますがご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • ロックファイルが消える

    ファイルロックにflockを使っているのですが、複数のファイルを扱うので、データファイルにロックをかけるのではなく別途「ロックファイル」に対してロックをかけています。 データファイルであれば読み書きモードで開く必要がありますが、ロックファイルは中身はどうでも良いので、 open(LOCK,"> $lockfile") or die ~ というように上書きモードで開いて良いとする解説を読んだので、そのようにしています。 しかし、ごくたまにロックファイルが消えてしまう現象が発生します(なかなか再現できずに条件など特定できず)。 あくまでもファイルの中身が壊れるとかいうことではなくて、ファイルそのものが消えます。 そこでお聞きしたいのですが、 1. ロックをかけたファイルが何らかの原因で消えた場合、ロック状態も消失してしまう(他プロセスがロックできてしまう)のでしょうか? 試してみたのですが、  まずプロセスAがロックをかけて  プロセスBが同ファイルにロックをかけようとすると、失敗する  プロセスAがロック解除せずにファイルを削除する  それでもプロセスBはロックに失敗する  プロセスAが(もう存在しないファイルの)ロックを解除(close)する  するとプロセスBはロックに成功する ということは分かったのですが、上記を、プロセスAがファイルを削除した後にプロセスBを動かすと、どういうわけかロックに成功してしまいます。 2. 複数プロセスが同時に上書きモードでopenしようとするのが消える原因なら、ロックファイルであってもやはり読み書きモードで開くべきなのでしょうか。そしてそれなら消えることは無いのでしょうか。 (読み込みモードではロックできないという解説もありました。) 御教授のほどよろしくお願いいたします。

  • PerlとPHPで同一ファイルをファイルロック

    PerlとPHPで同一のファイルを読み書きする必要があるのですが、ファイルロックする機構を作るには互いの言語でmkdirで対応したほうがよいのでしょうか? flock関数がPerlにもPHPにもありますが、これは、PHPのプロセスで実行したロックの状態をPerlで検知したり、または逆のことはできないのでしょうか? もしできないとするとmkdirで同一の機構を作ったほうが良い気もしますが、何か問題などは起きないでしょうか。

    • ベストアンサー
    • PHP