linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是
下面的Perl子例程使用File :: FcntlLock来检查文件是否被锁定.
为什么它返回0并且打印/tmp/test.pid被解锁.即使文件被锁定了? sub getPidOwningLock { my $filename = shift; my $fs = new File::FcntlLock; $fs->l_type( F_WRLCK ); $fs->l_whence( SEEK_SET ); $fs->l_start( 0 ); $fs->l_len( 0 ); my $fd; if (!open($fd,'+<',$filename)) { print "Could not open $filenamen"; return -1; } if (!$fs->lock($fd,F_GETLK)) { print "Could not get lock information on $filename,error: $fs->errorn"; close($fd); return -1; } close($fd); if ($fs->l_type() == F_UNLCK) { print "$filename is unlocked.n"; return 0; } return $fs->l_pid(); } 该文件被锁定如下(lock.sh): #!/bin/sh ( flock -n 200 while true; do sleep 1; done ) 200>/tmp/test.pid 该文件确实已锁定: ~$./lock.sh & [2] 16803 ~$lsof /tmp/test.pid COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 26002 admin 200w REG 8,5 0 584649 test.pid sleep 26432 admin 200w REG 8,5 0 584649 test.pid 解决方法
fcntl和flock锁彼此不可见.
这对您的用例来说是个大问题,因为您在shell脚本中使用的flock实用程序依赖于flock语义:shell脚本运行flock子进程,该进程锁定继承的文件描述符然后退出. shell保持该文件描述符打开(因为重定向是在整个命令序列上),直到它想要释放锁. 该计划无法与fcntl一起使用,因为进程之间不共享fcntl锁.如果有一个与flock相同但使用fcntl的实用程序,则锁定将过早释放(一旦子进程退出). 为了协调perl进程和shell脚本之间的文件锁定,您可以考虑的一些选项是: >将shell脚本移植到zsh并使用zsh / system模块内置的zsystem flock(注意:在声称使用fcntl的文档中,尽管它名称为flock) 有关不同类型锁的功能的更多信息,请参见What is the difference between locking with (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |