用户注册



邮箱:

密码:

用户登录


邮箱:

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

发表随想


还能输入: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、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

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

加载中,请稍后...