对于我即将推出的 PulseAudio 库,我想重定向 STDERR
和 STDOUT
至 /dev/null
从逻辑上讲,这是有效的,
sub _exec {
open (*STDERR, '>', '/dev/null');
open (*STDOUT, '>', '/dev/null');
CORE::system('pacmd', @_ ) or die $?;
但是,这仍然输出到术语....
sub _exec {
local ( *STDERR, *STDOUT );
open (*STDERR, '>', '/dev/null');
open (*STDOUT, '>', '/dev/null');
CORE::system('pacmd', @_ ) or die $?;
这给我留下了两个问题
最佳答案
child 写入 fd 1 和 2,但您没有更改 fd 1 和 2。您只是使用 fd 3 和 4( child 不关心的东西)创建了新的 Perl 变量( child 一无所知)。
这是实现您想要的一种方法:
use IPC::Open3 qw( open3 );
sub _exec {
open(local *CHILD_STDIN, '<', '/dev/null') or die $!;
open(local *CHILD_STDOUT, '>', '/dev/null') or die $!;
my $pid = open3(
'<&CHILD_STDIN',
'>&CHILD_STDOUT',
undef, # 2>&1
'pacmd', @_,
);
waitpid($pid, 0);
die $! if $? == -1;
die &? if $?;
}
open3
是相当低的水平,但它比自己做要高得多*。 IPC::Run和 IPC::Run3甚至更高的水平。* — 它负责 fork 并将句柄分配给正确的文件描述符。它处理错误检查,包括使 pre-
exec
子进程中的错误似乎是它们的启动失败,而不是来自已执行程序的错误。
关于perl - 为什么本地在 STDERR 和 STDOUT 上不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13833088/