[英]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.