![](/img/trans.png)
[英]File locking with Fcntl: Baffling bug involving 'use' and 'require'
[英]Can i use file locking in this scenario?
请我有一个概念性的问题。 我有两个进程在同一目录中输出同名文件,然后在 perl 脚本中执行/读取该文件。 这两个进程可以同时运行,恐怕文件有可能被另一个进程覆盖,因此其中一个进程执行了不正确的源文件。 基本上这行是这样的:(这两行对两个进程都是通用的)
$cmd = `my_script.pl`; ## This generates runx file
$cmd = `source runx | grep - i "Error";`
注意:我无法控制文件名,我必须同时运行这两个进程
我可以在第一个命令之后使用排他文件锁来防止串通吗?
您锁定的文件不一定是您要保护的文件。
use Fcntl qw( LOCK_EX );
my $output;
{
my $script_qfn = 'my_script.pl';
my $lock_qfn = $script_qfn . '.lock';
open(my $fh, '>', $lock_qfn)
or die("Can't create lock file \"$lock_qfn\": $!\n");
flock($fh, LOCK_EX)
or die("Can't lock \"$lock_qfn\": $!\n");
system { $script_qfn } $script_qfn;
$output = `source runx | grep -i Error`;
}
但是为什么不让my_script.pl
将其 output 发送到 STDOUT? 那么就不需要锁了。 您可以简单地使用以下内容:
my $output = `my_script.pl | sh | grep -i Error`;
调用system
的三种方式:
system($shell_command)
。system($prog, @args)
。 必须至少有一个 arg。system({ $prog } $arg0, @args)
。 0+ 个参数。 在这种情况下,我们没有 shell 命令,也没有任何参数,所以我们不得不使用第三种方法(或者构建一个 shell 命令,比如说,使用 String::ShellQuote 的shell_quote
)。 使用system($script_qfn)
会引入代码注入错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.