とあるエンジニアの闇歴史帳

コピペで使える便利Wiki ※現在構築中です。

ユーザ用ツール


perl:file_open_modea

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

perl:file_open_modea [2017/12/14 20:18]
perl:file_open_modea [2020/06/23 14:10] (現在)
行 1: 行 1:
 +====== 1回のファイルオープンで読み書きを同時にする - Perl ======
 +~~socialite~~
 +<note important>この記事は2006年10月04日に書かれたものです。</note>
 +
 +open関数でファイルを開き、読み書きを同時に行いたい場合はどうすれば良いだろうか?これを解決するには単純にファイルの読み書きモードを使用すれば良い。
 +
 +===== サンプル =====
 +<code perl>
 +#-------------------------------
 +#読み書きモードで開く
 +#-------------------------------
 +open(DAT, "+<file.txt");
 +flock(DAT, 2); # flockでロックをすれば読み書き両方がロック出来る
 +
 +#-------------------------------
 +#ファイル読込
 +#-------------------------------
 +$buff = <DAT>;
 +# @buff = <DAT>;
 +
 +#-------------------------------
 +#ファイルに記録
 +#-------------------------------
 +truncate(DAT, 0); #ファイルサイズを0byteに
 +seek(DAT, 0, 0); #書き込む場所をファイルの先頭に
 +print DAT "Hello!"; #ファイルに記録
 +close(DAT);
 +</code>
 +
 +例えばアクセスカウンターなどを作成した際にファイルロックが不十分だと、現在の値を読込むためにファイルを開き閉じる、その後書き込みむためにファイルを開き...という処理を行っていると、読み書きの間に他のプロセスが発生した場合に不整合が発生する可能性がある。
 +
 +もちろん、これ以外にも解決方法はあるが、ひとつの解法として覚えておいて損はない。
 +
 +===== 関連書籍 =====
 +{{amazon>jp:4873113008}}
 +<html><p style="clear:both"></p></html>
 +
 +{{amazon>jp:B00ISP0OM8}}
 +<html><p style="clear:both"></p></html>
 +
 +
 +{{tag>CGI・Perl例文集 Perl ファイル }}
 +~~socialite~~
  

関連ページ