我写的测试文件锁的代码,锁不能成功,那儿有问题?

我写的测试文件锁的代码,锁不能成功,那儿有问题?

use strict;
use Fcntl qw(:flock);

open FILE,">","test.lock" or die $!;

if (fork) {
    flock(FILE,LOCK_EX);
    select(FILE);$|=1;
    print FILE "This parent $$ \n" or die "parent err: $!\n";
    sleep 10;
    close FILE;
}else{
      
    flock(FILE,LOCK_EX | LOCK_NB) or die "child err: $!";
    #print FILE "This child $$ \n";


}

我在父进程中锁住了文件,应该在紫进程内的这flock(FILE,LOCK_EX | LOCK_NB) or die "child err: $!"; 因该执行报错才对啊。但是为什么返回是成功呢?


另外一段:

use strict;
use Fcntl qw(:flock);

open FILE,">","test.lock" or die $!;
flock(FILE,LOCK_EX) or die "first error: $! ";
flock(FILE,LOCK_EX) or die "sec error: $!";

这段代码种,第二个flock应该出错阿,因为之前已经锁住了这个这个文件。这是什么原因呢?


QUOTE:
原帖由 miaho 于 2009-1-11 17:01 发表
use strict;
use Fcntl qw(:flock);

open FILE,">","test.lock" or die $!;

if (fork) {
    flock(FILE,LOCK_EX);
    select(FILE);$|=1;
    print FILE "This parent $$ \n" or die "parent err: $!\n";
    sleep 10;
    close FILE;
}else{
      
    flock(FILE,LOCK_EX | LOCK_NB) or die "child err: $!";
    #print FILE "This child $$ \n";


}

我在父进程中锁住了文件,应该在紫进程内的这flock(FILE,LOCK_EX | LOCK_NB) or die "child err: $!"; 因该执行报错才对啊。但是为什么返回是成功呢?

你的 FILE 在 fork 之前已经打开,查查这种情况下在你的系统上 flock(2) 创建的锁是不是父子进程共享的。注意,flock(2) 创建的锁是针对文件,而不是文件描述符。

QUOTE:
另外一段:

use strict;
use Fcntl qw(:flock);

open FILE,">","test.lock" or die $!;
flock(FILE,LOCK_EX) or die "first error: $! ";
flock(FILE,LOCK_EX) or die "sec error: $!";

这段代码种,第二个flock应该出错阿,因为之前已经锁住了这个这个文件。这是什么原因呢?

同样,查查在你的系统上一个进程可不可以多次锁住同一个文件。


QUOTE:
原帖由 MMMIX 于 2009-1-11 18:27 发表
你的 FILE 在 fork 之前已经打开,查查这种情况下在你的系统上 flock(2) 创建的锁是不是父子进程共享的。注意,flock(2) 创建的锁是针对文件,而不是文件描述符

请问这个是不是在fork(2)里说明的, 还可以查哪些文档?内核相关文档应该有吧,不过这么说范围有点大?
我的系统中后续的flock调用只会更新lock模式。
设置LOCK_EX | LOCK_NB, 在两个进程中执行脚本,会报错


QUOTE:
原帖由 ynchnluiti 于 2009-1-11 18:39 发表

请问这个是不是在fork(2)里说明的, 还可以查哪些文档?内核相关文档应该有吧,不过这么说范围有点大?

fork(2) 应该看,flock(2) 也应该看。


QUOTE:
原帖由 ynchnluiti 于 2009-1-11 18:44 发表
我的系统中后续的flock调用只会更新lock模式。
设置LOCK_EX | LOCK_NB, 在两个进程中执行脚本,会报错

对 Unix-like 系统,一个打开文件在 os kernel 中是通过两部分数据描述的,一部分和 file descriptor 在一起,一部分和 os kernel 中和打开文件相关的数据结构(具体叫啥名字忘了)在一起,多个 file descriptor 可对应同一个 os kernel 中的打开文件。这个在 apue2 里面有描述,建议看看。
谢谢 MMMIX 兄 和 ynchnluiti  兄的热心回答。


QUOTE:
原帖由 MMMIX 于 2009-1-11 18:52 发表

fork(2) 应该看,flock(2) 也应该看。



QUOTE:
Locks created by flock() are associated with an open file table entry.  This means that duplicate file descriptors (created by, for example, fork(2) or dup(2)) refer to the same lock



QUOTE:
原帖由 MMMIX 于 2009-1-11 18:56 发表

对 Unix-like 系统,一个打开文件在 os kernel 中是通过两部分数据描述的,一部分和 file descriptor 在一起,一部分和 os kernel 中和打开文件相关的数据结构(具体叫啥名字忘了)在一起,多个 file descripto ...

看过忘了 。再去看看