import os
import fcntl
import errno
def lock_file(filename):
fd = os.open(filename, os.O_CREAT | os.O_WRONLY, 0666)
try:
fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
return True
except IOError, e:
if e.errno in (errno.EACCES, errno.EAGAIN):
return False
if not lock_file('/tmp/test.lock'):
print "another instance is running"lock_file('/tmp/test.lock')
再附上一份perl的代码:
use Fcntl qw(:flock);
my $lockdir = 'lock';
if (!-d $lockdir) {
mkdir $lockdir, 0755;
my $status=$!;
die "Failed to create $lockdir: $status\n" if (!-d $lockdir);
}
my $lockfile="$lockdir/test.pid";
if (!open(PID, ">$lockfile")) {
die "can not open pid file\n";
}
unless (flock(PID, LOCK_EX|LOCK_NB)) {
die "can not lock pid file\n";
}
print "locked\n";
顺便再抱怨两句,perl5补丁摞补丁的语法很怪异,异常处理机制竟然要用if...unless,类的写法也搞得跟写dll一样。不得不说,perl的语法离现代语言太远了。一个优美的语言可以提高开发效率,期待一下perl6最终出来的样子。