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