gpt4 book ai didi

当 STDIN、STDOUT 和 STDERR 关闭时的 perl 错误?

转载 作者:行者123 更新时间:2023-12-05 01:01:18 26 4
gpt4 key购买 nike

在编写守护进程时,我想关闭 STDIN、STDOUT 和 STDERR 以实现“良好的守护进程行为”。但我感到很惊讶。文件的后续打开需要与旧的 STDIN、STDOUT 和 STDERR 相同的属性(因为它们的 fileno-s 被重新打开了?)

这是warn.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 中?

这可能类似于 How can I reinitialize Perl's STDIN/STDOUT/STDERR? ,但公认的解决方案是像我一样关闭 STDIN、STDOUT 和 STDERR。

最佳答案

这些是警告,而不是错误。我想它们存在是因为如果您的程序随后 fork 并执行了一个不同的程序,那么该程序可能会很困惑,因为它的标准输入流是为输出打开的,它的标准输出和错误流是为输入打开的。

当您确定自己知道自己在做什么时,取消警告是完全合法的。在这种情况下,您只需添加 no warnings 'io';在您之前 open s。

关于当 STDIN、STDOUT 和 STDERR 关闭时的 perl 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9321422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com