perl - IPC::Open2 输出到已打开的文件句柄(按照文档示例)

标签 perl ipc

perldoc IPC::Open2 中记录的示例(从父 STDIN 读取并写入已打开的句柄)是我想要实现的目标的简化版本。即,父进程将前导码写入输出文件,然后子进程将其输出直接写入同一文件。

我制作了一个简单的子脚本,它读取输入行并打印到 STDERRSTDOUTSTDOUT 是来自父级的“已打开句柄”。

#!/usr/bin/env perl
##parent.pl
use IPC::Open2;

# read from parent STDIN and write to already open handle
open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");

# reap zombie and retrieve exit status
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
#!/usr/bin/env perl
##child.pl

while(<STDIN>){
    print STDOUT "STDOUT: ",$_;
    print STDERR "STDERR: ", $_;
}
print STDERR "END OF CHILD\n";

parent.pl 的运行示例:

Hello
^D
STDERR: Hello
STDERR: END OF CHILD

但是,我在输出文件“outfile.txt”中没有看到预期的“STDOUT:Hello”

为了使这个示例正常工作,我是否遗漏了一些额外的设置?

最佳答案

open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2($file, "<&STDIN", "./child.pl");

这将创建一个新管道,并使用引用管道读取端的句柄覆盖 $file 变量,从而关闭进程中的旧文件句柄;-)

为了将现有文件句柄传递给 open2open3,您想要使用 >&FILEHANDLE 格式,但我没有'当 FILEHANDLE 是局部变量(如您的 my $file)时,无法找到任何方法来做到这一点。

但是未记录的 >&NUM>&=NUM 形式(其中 NUM 是文件描述符编号)可以正常工作:

open my $file, '>', 'outfile.txt' or die "open failed: $!";
my $pid = open2('>&'.fileno($file), '<&STDIN', './child.pl');

示例:

$ perl -MIPC::Open2 -e '
   open my $f, ">foo";
   open2(">&".fileno($f), "<&STDIN", "echo bar")
'; cat foo
bar

关于perl - IPC::Open2 输出到已打开的文件句柄(按照文档示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66129291/

相关文章:

android - 如何将套接字/文件描述符传递给Android中的其他应用程序

perl - 这是构建利用数组的 Perl 哈希的正确方法吗?

arrays - 如何在 Perl 中合并散列?

android - Android中两个进程如何共享相同的代码?

c++ - boost ipc new 和 delete 运算符

c - 尝试使用 semget() 获取信号量集,但我不断收到 EEXIST 错误,即使在创建新 key 后也是如此

mysql - 如何从 SQL 查询中获取多列并将它们存储在 perl 的二维数组中

perl - 使用 XML::Twig,如何检查两个节点是否具有完全相同的子节点和属性?

linux - 使用 unix 排序对字母数字进行排序

php - 将数据从 PHP 传递到 Python