- 论坛徽章:
- 0
|
使用fork创建多进程后想在子进程中输出日志信息,所有信息都输出到同一个文件中,但是经常出现消息混乱的现象,所以使用flock锁定输出句柄,不过测试依旧出现混乱的现象,不知何故。
另外,不知道有没有其他更简单的方法可以记录日志,最好能稍微详细点介绍下。
下面是我测试用的代码,输出中有混乱。- use strict;
- use warnings;
- use Fcntl qw':flock SEEK_END';
- my $to_file_name = 'log'; # input file name
- unlink 'log';
- sub lock {
- my ($fh) = @_;
- flock($fh, LOCK_EX) or die "Cannot lock - $!\n";
- seek($fh, 0, SEEK_END) or die "Cannot seek - $!\n";
- }
- sub unlock {
- my ($fh) = @_;
- flock($fh, LOCK_UN) or die "Cannot unlock - $!\n";
- }
- open my $to, '>>', $to_file_name
- or die "$0 : failed to open output file '$to_file_name' : $!\n";
- my @childs;
- for (0 .. 5) {
- my $pid = fork();
- die unless defined $pid;
- if ($pid == 0) {
- my $i = 0;
- lock($to);
- while ($i++ < 1000) {
- my $t = localtime; print {$to} "$t. $: $i\n";
- }
- unlock($to);
- # close $to;
- }
- else { push @childs, $pid; }
- }
- waitpid($_, 0) for @childs;
- close $to
- or warn "$0 : failed to close output file '$to_file_name' : $!\n";
复制代码 另外有一个疑惑,就是fork把所有变量复制一份到子进程中,这样的话在子进程中关闭在父进程中打开的文件句柄按理应该不会影响其他子进程,但是上面的例子中在子进程中关闭句柄会报错,不解。 |
|