LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 784|回复: 3

关于 flock 的疑问

[复制链接]
发表于 2004-7-2 15:07:51 | 显示全部楼层 |阅读模式
perl语言编程中说:"flock缺省时是一个阻塞操作。也就是说,如果不能立即获取
你需要的锁,操作系统会推迟你的处理,直到能够获得锁为止。"
因此,编写如下测试程序:
#!/usr/bin/perl

use Fcntl qw(EFAULT :flock);
open(FH,"<test.lock");

if ($PID=fork()) {
        sleep 2;

        print "father:try to get lock\n";
        flock(FH,LOCK_EX);

        print "father:i have got lock\n";

        flock(FH,LOCK_UN);
        print "\nfather:I have released lock\n";

} else {
        print "son:try to get lock\n";
        flock(FH,LOCK_EX);

        print "son:I have got lock\n";
        sleep 5;

        flock(FH,LOCK_UN);
        print "\nson:I have released lock\n";
}

运行结果:
son:try to get lock
son:I have got lock
father:try to get lock
father:i have got lock

father:I have released lock

son:I have released lock

很显然 flock 没有进行阻塞,请教各位TX,错误在哪。
发表于 2004-7-2 16:55:34 | 显示全部楼层
兄弟是不是用 windows 的?
 楼主| 发表于 2004-7-3 22:18:07 | 显示全部楼层

不是的

用的 linux (knoppix 和 debian)和 aix 5.1
perl 版本为 5.8 和 5.6
我怀疑 flock 在多进程下工作不正常
 楼主| 发表于 2004-7-3 22:22:28 | 显示全部楼层
但是如果在多进程下不正常那 flock 就没有意义了。

我猜测可能是如下原因:

flock 的锁并非系统级的,是由perl 维护。
当程序 fork 出一个子进程时,在该文件句柄上的锁状态也继承下来。
因此父子进程都认为文件上没有加锁。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表