在这种情况下我可以使用文件锁定吗



请给我一个概念问题。我有两个进程,它们在同一目录中输出一个同名文件,然后在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将其输出发送到STDOUT呢?那么就不需要锁了。您可以简单地使用以下内容:

my $output = `my_script.pl | sh | grep -i Error`;

调用system:有三种方法

  • system($shell_command)
  • system($prog, @args)。必须至少有一个参数
  • system({ $prog } $arg0, @args)。0+参数

在这种情况下,我们没有shell命令,也没有任何args,所以我们必须使用第三种方法(或者构建一个shell命令,比如使用String::ShellQuote的shell_quote(。使用system($script_qfn)会引入一个代码注入错误。

相关内容

  • 没有找到相关文章

最新更新