用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - perl代码库

perl 锁定dbm文件

2012-10-14 作者: 神马举报

[perl]代码库

#-----------------------------
# download the following standalone program
#!/usr/bin/perl
# dblockdemo - demo locking dbm databases
use DB_File;
use strict;

sub LOCK_SH { 1 }                   # In case you don't have
	sub LOCK_EX { 2 }                   # the standard Fcntl module.  You
	sub LOCK_NB { 4 }                   # should, but who can tell
	sub LOCK_UN { 8 }                   # how those chips fall?

	my($oldval, $fd, $db, %db, $value, $key);

$key    = shift || 'default';
		$value  = shift || 'magic';
		$value .= " $$";

		$db = tie(%db, 'DB_File', '/tmp/foo.db', O_CREAT|O_RDWR, 0666)
		or die "dbcreat /tmp/foo.db $!";
		$fd = $db->fd;                      # need this for locking
		print "$$: db fd is $fd\n";
		open(DB_FH, "+<&=$fd")
		or die "dup $!";

		unless (flock (DB_FH, LOCK_SH | LOCK_NB)) {
		print "$$: CONTENTION; can't read during write update!
		Waiting for read lock ( $! ) ....";
			unless (flock (DB_FH, LOCK_SH)) { die "flock:
$!" }
}
print "$$:
Read lock granted\n";

$oldval = $db{$key};
print "$$:
Old value was $oldval\n";
flock(DB_FH, LOCK_UN);

unless (flock (DB_FH, LOCK_EX | LOCK_NB)) {
print "$$:
CONTENTION;
must have exclusive lock!
Waiting for write lock ( $! ) ....";
unless (flock (DB_FH, LOCK_EX)) { die "flock:
	$!" }
}

print "$$:
	Write lock granted\n";
	$db{$key} = $value;
	$db->sync;  # to flush
	sleep 10;

	flock(DB_FH, LOCK_UN);
	undef $db;
	untie %db;
	close(DB_FH);
print "$$:
	Updated db to $key=$value\n";

#-----------------------------


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...