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

Posted

技术标签:

【中文标题】我可以在这种情况下使用文件锁定吗?【英文标题】:Can i use file locking in this scenario? 【发布时间】:2021-07-09 23:55:48 【问题描述】:

请问我有一个概念性问题。我有两个进程在同一目录中输出同名文件,然后在 perl 脚本中执行/读取该文件。这两个进程可以同时运行,我担心文件有可能被另一个进程覆盖,因此其中一个进程执行了不正确的源文件。基本上这行是这样的:(这两行是两个进程共有的)

$cmd = `my_script.pl`;  ## This generates runx file
$cmd = `source runx | grep - i "Error";`

注意:我无法控制文件名,我必须同时运行两个进程

我可以在第一个命令之后使用独占文件锁来防止串通吗?

【问题讨论】:

【参考方案1】:

您锁定的文件不一定是您要保护的文件。

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)。必须至少有一个 arg。 system( $prog $arg0, @args)。 0+ 个参数。

在这种情况下,我们没有 shell 命令,也没有任何 args,所以我们不得不使用第三种方法(或者构建一个 shell 命令,比如说,使用 String::ShellQuote 的shell_quote) .使用system($script_qfn) 会引入code injection bug。

【讨论】:

请问为什么您在 中有代码主体?这只是为了清楚吗?我也可以试试你的其他建议。 答案添加到帖子底部。 system($script_qfn) 会引入 code injection bug。 非常感谢!知道我可以在调用脚本的两个进程中锁定 perl 脚本,真是太棒了!我喜欢这个主意!

以上是关于我可以在这种情况下使用文件锁定吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 `with:` 语句的 Python 文件锁模块行为

在那些简单的情况下使用 C# 锁有用吗? [复制]

添加断点时 Javascript 文件被锁定

如何在不锁定活动方向的情况下锁定片段方向?

Java FileWriter 覆盖

是否可以在不锁定的情况下与 NamespaceProxy 和 BaseManager 共享复杂对象?