我有一些子进程应该将一些日志写入一个公共文件。我想知道这段代码是否有效,以便进程写入公共文件而不会发生冲突:
sub appendLogs {
open FILE, "+>>", $DMP or die "$!";
flock FILE, LOCK_EX or die "$!";
print FILE "xyz\n";
close FILE;
}
如果没有,你能给我任何提示,我该如何修复或改进它?
我有一些子进程应该将一些日志写入一个公共文件。我想知道这段代码是否有效,以便进程写入公共文件而不会发生冲突:
sub appendLogs {
open FILE, "+>>", $DMP or die "$!";
flock FILE, LOCK_EX or die "$!";
print FILE "xyz\n";
close FILE;
}
如果没有,你能给我任何提示,我该如何修复或改进它?
出于日志记录的目的,我会使用Log4perl而不是重新发明轮子。它支持您正在寻找的内容。
是的,只要每个尝试写入文件的进程都使用flock
,它们就不会发生冲突。
如果您希望您的代码具有可移植性,您应该在锁定文件句柄之后但在写入文件之前查找文件末尾。请参阅 中的“邮箱附加程序”示例perldoc -f flock
,这与您正在执行的操作类似。
sub appendLogs {
open FILE, "+>>", $DMP or die "$!";
flock FILE, LOCK_EX or die "$!";
seek FILE, 0, 2; # <--- after lock, move cursor to end of file
print FILE "xyz\n";
close FILE;
}
这seek
可能是必要的,因为在您打开文件句柄之后但在获取锁之前,另一个进程可能会附加文件(并移动文件末尾的位置)。