warning: Creating default object from empty value in /var/www/drupal-5.23/modules/taxonomy/taxonomy.module on line 1418.

Perl で、ファイルをロック・アンロックする方法

ファイルのロックアンロックは、flock 関数を使う方法もあるが、この方法はすべてのプラットフォームで使えるというわけではない。 そのため、OS のシンボリックリンク機能を使う。OS がファイルを作成するときに排他制御を行うのを利用する。空のファイルを作成し、そのファイルが存在するかどうかチェックする方法と一見変わらないように見えるが、この方法だとファイルをオープンし、クローズするという2ステップが必要となる。このため、完全な排他にはならない。よって、シンボリックリンクというところがミソである。シンボリックリンクの他には、ディレクトリを作成する方法、ファイル名を変更する方法もあるが、私が知る限りはこの方法を紹介しているサイトが多いように思う。 使用するモジュール
なし
#!/usr/bin/perl

our $HOME_DIR = 'ホームディレクトリをここに書く';
our $LOCK_DIR = "$HOME_DIR/lock";     # このディレクトリのアクセス権は 777 である。
our $LOCK_FILE = 'ロックするファイル名をここに書く。なんでもよい。';

sub file_lock {
   my $wait = 5;
   while (!symlink(".","$HOME_DIR/$LOCK_DIR/.$LOCK_FILE"))   {
       if (--$wait <= 0) {
           # &error('現在他の方が使用中です。しばらくしてから再度ご利用ください。');
       }
       sleep (1);
   }
}

sub file_unlock {
   unlink ("$HOME_DIR/$LOCK_DIR/lock/.$LOCK_FILE");
}

1;
ファイルのロックアンロックは、flock 関数を使う方法もあるが、この方法はすべてのプラットフォームで使えるというわけではない。 そのため、OS のシンボリックリンク機能を使う。OS がファイルを作成するときに排他制御を行うのを利用する。空のファイルを作成し、そのファイルが存在するかどうかチェックする方法と一見変わらないように見えるが、この方法だとファイルをオープンし、クローズするという2ステップが必要となる。このため、完全な排他にはならない。よって、シンボリックリンクというところがミソである。シンボリックリンクの他には、ディレクトリを作成する方法、ファイル名を変更する方法もあるが、私が知る限りはこの方法を紹介しているサイトが多いように思う。 使用するモジュール
なし
#!/usr/bin/perl

our $HOME_DIR = 'ホームディレクトリをここに書く';
our $LOCK_DIR = "$HOME_DIR/lock";     # このディレクトリのアクセス権は 777 である。
our $LOCK_FILE = 'ロックするファイル名をここに書く。なんでもよい。';

sub file_lock {
   my $wait = 5;
   while (!symlink(".","$HOME_DIR/$LOCK_DIR/.$LOCK_FILE"))   {
       if (--$wait <= 0) {
           # &error('現在他の方が使用中です。しばらくしてから再度ご利用ください。');
       }
       sleep (1);
   }
}

sub file_unlock {
   unlink ("$HOME_DIR/$LOCK_DIR/lock/.$LOCK_FILE");
}

1;