perl函数说明(flock)

  • flock FILEHANDLE OPERATION

flock 函数是 Perl 的可移植的文件锁定的接口,尽管它只是锁住整个文件,而不是记录。该函数会把与 FILEHANDLE 关联的文件锁住,成功时返回真,失败时返回假。为了避免可能的数据丢失现象,Perl 在锁住或者解锁文件之前刷新 FILEHANDLE。Perl 实现它的 flock 的方法可能是 flock(2),fcntl(2),lockf(3),或者其他的什么平台相关的锁机制,但是如果所有这些都没有,那么调用 flock 将会抛出一个例外。参阅第十六章的“文件锁定”一节。

OPERATION 是 LOCK_SH,LOCK_EX,或者 LOCK_UN 之一,可能是与 LOCK_NB 或(OR)的。这些常量通常的值是 1,2,8,和 4,但是如果你是从 Fcntl 里分别或者用 :flock 标签成组地输入它们的,那么你可以使用符号名字。

LOCK_SH 请求一个共享的锁,所以它常用于读取。LOCK_EX 请求一个排它的锁,所以它常用于写。 LOCK_UN 释放前面一次请求的所;关闭该文件同样也释放任何锁。如果 LOCK_NB 位和 LOCK_SH 或者 LOCK_EX 一起使用,那么 flock 会马上返回,而不是等待一个可用的锁。检查返回状态看看你是否获得了你请求的锁。如果你不使用 LOCK_NB,那么你就有可能永远等待系统授予你想要的锁。

flock 的另外一个不明显但很常用的方面是它的锁只是劝告性的。自由的锁更灵活,但是不能象命令性的锁那样有保证。这就意味着用 flock 锁住的文件可能被那些没有使用 flock 的程序修改。等待红灯的车相互之间可以和睦相处,但和不遵守红灯的车之间可就不能相容了。防卫性驾驶。

有些 flock 的实现不能透过网络锁住东西。尽管理论上你可以使用更加系统相关的 fcntl 来做这件事,但这么做是否(能够)可靠仍然是有怀疑的。

下面是一个用于 Unix 系统的邮箱附件箱,它使用 flock(2) 来锁住邮箱:

   use Fcntl qw/:flock/;      # 输出 LOCK_* 常量
   sub mylock {
      flock(MBOX, LOCK_EX)
         or die "can't lock mailbox: $!";
      # 预防在我们等待的时候有家伙附加
      # 以及我们的 stdio 缓冲区失准
      seek(MBOX, 0, 2)
         or die "can't seek to the end of mailbox: $!";
   }

   open(mbox, ">>/USR/SPOOL/MAIL/$ENV{'USER'}")
      or die "can't open mailbox: $!";

   mylock();
   print MBOX $msg, "\n\n";
   close MBOX
      or die "can't close mailbox: $!";

在那些支持真正的 flock(2) 系统调用的系统上,锁是在跨 fork 继承的。其他实现则没那么走运,并且很可能在 fork 之间丢失锁。又见第三十二章的 DB_File 模块获取其他的 flock 的例子。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值