gpt4 book ai didi

perl - 使用 Fcntl : Baffling bug involving 'use' and 'require' 锁定文件

转载 作者:行者123 更新时间:2023-12-04 16:50:59 26 4
gpt4 key购买 nike

以下 Perl 脚本如您所料输出“SUCCESS”:

use Fcntl qw(:DEFAULT :flock);
sysopen(LF, "test.txt", O_RDONLY | O_CREAT) or die "SYSOPEN FAIL: $!";
if(flock(LF, LOCK_EX)) { print "SUCCESS.\n"; }
else { print "FAIL: $!\n"; }

但是现在,将第一行替换为
require "testlib.pl";

其中 teSTLib.pl 包含
use Fcntl qw(:DEFAULT :flock);

1;

现在,奇怪的是,脚本失败了,就像这样:
FAIL: Bad file descriptor

问题:为什么?

添加:

现在我知道为什么了——谢谢! - 我想知道处理这个问题的最佳方法是什么:
  • 只需做 use Fcntl两次,一次在主脚本中,一次在所需的库中(主脚本和库都需要它)。
  • 用 &O_RDONLY 等替换 O_RDONLY
  • 用 O_RDONLY() 等替换 O_RDONLY
  • 还有什么?
  • 最佳答案

    通过上述 use , 你剥夺了 Perl 解析器的知识 O_RDONLY等。是无参数的子程序。在这种情况下,您必须更加详细:

    sysopen(LF, "test.txt", O_RDONLY() | O_CREAT()) or die "SYSOPEN FAIL: $!";
    if(flock(LF, LOCK_EX())) { print "SUCCESS.\n"; }

    编辑:进一步详细说明,没有括号, O_RDONLYO_CREAT被解释为裸字(字符串),当二进制或运算在一起时,它们的行为不像您期望的那样:
    $ perl -le 'print O_RDONLY | O_CREAT'
    O_SVOO\Y

    (单个字符按位或组合在一起。)

    在这种情况下,字符串“O_SVOO\Y”(或系统上的任何内容)被解释为数字 0 到 sysopen ,因此只要 O_RDONLY 仍然有效是 0(这是典型的)并且文件已经存在(所以 O_CREAT 是多余的)。但是 fcntl显然对非数字参数并不宽容:
    $ perl -e 'flock STDOUT, "LOCK_EX" or die "Failed: $!"'
    Failed: Bad file descriptor at -e line 1.

    相似地:
    $ perl -e 'flock STDOUT, LOCK_EX or die "Failed: $!"'
    Failed: Bad file descriptor at -e line 1.

    然而:
    $ perl -e 'use Fcntl qw(:flock); flock STDOUT, LOCK_EX or die "Failed: $!"'
    (no output)

    最后,请注意 use strict提供了许多有用的线索。

    关于perl - 使用 Fcntl : Baffling bug involving 'use' and 'require' 锁定文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175568/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com