ロックのサンプル
ロックのサンプルを以下に示します。
※flockが使用可能な場合は、ロックが解除された後にもlock1.datが残ります。
$LockFile0 = './lock0.dat'; # ロックファイル名(mkdir、symlink用)
$LockFile1 = './lock1.dat'; # ロックファイル名(flock用)
$LockMode = 0 ; # ロックモード(0:mkdir、1:flock、2:symlink)
eval { flock( LOCKCHK, 8 ) ; } ;
if ( ! $@ )
{
$LockMode = 1 ;
}
else
{
eval { symlink("",""); } ;
if ( ! $@ ) { $LockMode = 2 ; }
}
$LockFlg = 0 ; # ロックフラグ(0:ロックしていない,1:ロックしている)
・
・
・
&Lock ;
if ( $LockFlg ) # ロック成功?
{
#ファイルアクセス処理
}
else
{
#エラー処理
}
&Unlock ;
・
・
・
#-----------------------------------------------------------------------#
# ロック
# 入力用変数: $LockMode …ロックモード
# $LockFile0 …ロックファイル名(mkdir、symlink用)
# $LockFile1 …ロックファイル名(flock用)
# 出力用変数: $LockFlg …ロックフラグ(0:ロックしていない,1:ロックしている)
# LOCK1 …ロックファイルハンドル(flock用)
#-----------------------------------------------------------------------#
sub Lock
{
local($i) ;
$LockFlg = 0 ;
for( $i = 0; $i < 5; $i++ )
{
if ( $LockMode == 1 )
{
if ( open( LOCK1, ">$LockFile1" ) )
{
if ( flock( LOCK1, 6 ) )
{
$LockFlg = 1 ;
last ;
}
close( LOCK1 ) ;
}
else
{
last ;
}
}
elsif ( $LockMode == 2 )
{
if ( symlink(".", $LockFile0) )
{
$LockFlg = 1 ;
last ;
}
}
else
{
if ( mkdir( $LockFile0, 0755 ) )
{
$LockFlg = 1 ;
last ;
}
}
sleep(1) ; # 1秒Sleep
# sleep時間を短くする場合は下記のコードに変更
# select(undef, undef, undef, 0.5) ; # 0.5秒Sleep
}
}
#-----------------------------------------------------------------------#
# アンロック
# 入力用変数: $LockFlg …ロックフラグ(0:ロックしていない,1:ロックしている)
# $LockMode …ロックモード
# $LockFile0 …ロックファイル名(mkdir、symlink用)
# LOCK1 …ロックファイルハンドル(flock用)
# 出力用変数: $LockFlg …ロックフラグ(0:ロックしていない)
#-----------------------------------------------------------------------#
sub Unlock
{
if ( $LockFlg )
{
if ( $LockMode == 1 )
{
flock( LOCK1, 8 ) ;
close( LOCK1 ) ;
}
elsif ( $LockMode == 2 )
{
unlink( $LockFile0 ) ;
}
else
{
rmdir( $LockFile0 ) ;
}
$LockFlg = 0 ;
}
}