perlで読み書き両用ファイルオープンするには?

[上に] [前に] [次に]
織田信長 1998/04/07(火) 14:17:27
以前はファイル・ロックにとほほさん式のディレクトリ作成方式を
使っていましたが、なんらかの原因でロック・ディレクトリが残っ
てしまうことが多く、flockを使う方法に変更しました。
具体的には、

 open(LOG, "file");
 flock(LOG, 1);
 @log = <LOG>;
 flock(LOG, 8);
 close(LOG);

   @log への操作

 open(LOG, ">file");
 flock(LOG, 2);
 print LOG @log;
 flock(LOG, 8);
 close(LOG)

ってな感じです。

でも、@logへの操作中に他プロセスがfileをアクセスできてしまいま
すよね?だから、

 open(LOG, "file");
 flock(LOG, 2);
 @log = <LOG>;

   @log への操作

 print LOG @log;
 flock(LOG, 8);
 close(LOG);

ってな感じにしたいのですが、読み書き両用openがうまく行きません。
"+<file" や "+>file"、"+>>file" など、いろいろ書式があるのですが、
どれもこれも 「@logが取り出せて、print LOG が完全上書きになる」
という条件を満たしてくれません。

ご指南のほどおねがいいたします。

B-Cus 1998/04/07(火) 23:47:59
試してませんけど、別のファイルをロックファイルとして
扱って、そのファイルをflockしている間に目的ファイルを
操作するというのはどうですか?

あと、これも試してませんが、seekを使うとか。これは無理っぽいかな。

とほほ 1998/04/07(火) 23:50:29
以下のコードでできるようです。

open(LOG, "+>file");
flock(LOG, 2);
@log = <LOG>;
seek(LOG, 0, 0);
print LOG "HEHE";
truncate(LOG, tell());
flock(LOG, 8);
close(LOG);

ただし、truncate()はサポートしていないシステムもあるので注意。

織田信長 1998/04/08(水) 19:23:55
[[解決]]
>試してませんけど、別のファイルをロックファイルとして
>扱って、そのファイルをflockしている間に目的ファイルを
>操作するというのはどうですか?

おぉ! これは気づかなかった!
早速試してみたところ、どうやらOKのようです。
ありがとうございました。

とほほさんもありがとうございました。

[上に] [前に] [次に]