2

我有一些子进程应该将一些日志写入一个公共文件。我想知道这段代码是否有效,以便进程写入公共文件而不会发生冲突:

sub appendLogs {
    open FILE, "+>>", $DMP or die "$!";
    flock FILE, LOCK_EX or die "$!";
    print FILE "xyz\n";
    close FILE;
}

如果没有,你能给我任何提示,我该如何修复或改进它?

4

3 回答 3

4

出于日志记录的目的,我会使用Log4perl而不是重新发明轮子。它支持您正在寻找的内容。

于 2012-06-15T13:00:11.887 回答
3

是的,只要每个尝试写入文件的进程都使用flock,它们就不会发生冲突。

于 2012-06-15T12:51:32.590 回答
0

如果您希望您的代码具有可移植性,您应该在锁定文件句柄之后但在写入文件之前查找文件末尾。请参阅 中的“邮箱附加程序”示例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可能是必要的,因为在您打开文件句柄之后但在获取锁之前,另一个进程可能会附加文件(并移动文件末尾的位置)。

于 2012-06-15T15:06:08.697 回答