При написании демона я хочу закрыть STDIN, STDOUT и STDERR для «хорошего поведения демона». Но я удивился. Для последующего открытия файлов требуются те же свойства, что и у старых STDIN, STDOUT и STDERR (потому что их fileno-ы были повторно открыты?)
Вот это предупреждение.pl:
use warnings;
my $nrWarnings = 0;
$SIG{__WARN__} = sub {
no warnings;
$nrWarnings++;
open my $log, '>>', '/tmp/log.txt'
or die;
printf $log "%d: %s", $nrWarnings, @_;
close $log;
};
close STDOUT;
close STDERR;
close STDIN;
open my $o, '>', '/tmp/foobar.txt'
or die;
open my $i, '<', '/etc/passwd'
or die;
open my $i2, '<', '/etc/passwd'
or die;
open my $i3, '<', '/etc/passwd'
or die;
exit $nrWarnings;
И вот я запускаю это:
> rm -f /tmp/log.txt ; perl warn.pl; echo $? ; cat /tmp/log.txt
3
1: Filehandle STDIN reopened as $o only for output at warn.pl line 20.
2: Filehandle STDOUT reopened as $i only for input at warn.pl line 22.
3: Filehandle STDERR reopened as $i2 only for input at warn.pl line 24.
Я не ожидал предупреждений и $? == 0. Где ошибка? В моем коде или в Perl?
Это может выглядеть как Как я могу заново инициализировать Perl STDIN / STDOUT / STDERR? , но там было принято решение закрыть STDIN, STDOUT и STDERR, как я.