加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 为什么即使文件被锁定,File :: FcntlLock的l_type总是

发布时间:2020-12-14 00:54:07 所属栏目:Linux 来源:网络整理
导读:下面的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
下面的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)
>在perl中重写shell脚本
>只需在perl脚本中使用flock(放弃字节范围锁定和“get locker PID”功能 – 但你可以通过读取/ proc / locks在Linux上模拟它)
>在C语言中编写自己的fcntl实用程序以便在shell脚本中使用(使用模式将不同 – shell脚本必须对其进行后台处理,然后在以后将其解除以解锁 – 并且需要一些方法来告诉父进程何时它已经获得或未能获得锁定,这将很难,因为它现在异步发生…可能使用某些shell具有的协同处理功能).
>从shell脚本运行一个小的perl脚本来进行锁定(需要与专用fcntl实用程序需要的相同的后台处理)

有关不同类型锁的功能的更多信息,请参见What is the difference between locking with fcntl and flock.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读