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

问题描述

请问我有一个概念性的问题。我有两个进程在同一目录中输出同名文件,然后在 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 命令,也没有任何参数,所以我们不得不使用第三种方法(或者构建一个 shell 命令,比如使用 String::ShellQuote 的 {{1} })。使用 shell_quote 会引入 code injection bug

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...