Eva*_*oll 3 perl redirect stdout stderr
对于我即将推出的PulseAudio库,我想重定向STDERR并STDOUT在/dev/null逻辑上对此工作,
sub _exec {
open (*STDERR, '>', '/dev/null');
open (*STDOUT, '>', '/dev/null');
CORE::system('pacmd', @_ ) or die $?;
Run Code Online (Sandbox Code Playgroud)
但是,这仍然输出到......
sub _exec {
local ( *STDERR, *STDOUT );
open (*STDERR, '>', '/dev/null');
open (*STDOUT, '>', '/dev/null');
CORE::system('pacmd', @_ ) or die $?;
Run Code Online (Sandbox Code Playgroud)
这让我有两个问题
孩子写入fd 1和2,但你没有改变fd 1和2.你刚刚用fd 3和4创建了新的Perl变量(孩子一无所知)(孩子不关心的事情).
这是实现您想要的一种方式:
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 $?;
}
Run Code Online (Sandbox Code Playgroud)
open3是相当低的水平,但它远远高于自己做的水平*.IPC :: Run和IPC :: Run3甚至更高.
* - 它负责分叉并将句柄分配给正确的文件描述符.它处理错误检查,包括使子项中的预exec错误看起来是它们的启动失败而不是执行程序的错误.
| 归档时间: |
|
| 查看次数: |
710 次 |
| 最近记录: |