如何在不关闭进程的情况下将命令发送到进程?

时间:2012-10-16 01:10:45

标签: perl

我正在尝试启动一个Postgres客户端并保留它,以便我可以向它发送几个SQL命令并收集每个命令的结果。我当前的问题是第一组命令似乎没有被发送到进程,除非我关闭文件句柄以发送命令。但是关闭文件句柄会破坏程序的整个目的。

以下是代码:

my ($child_read, $child_write);
our $pid = open2($child_read, $child_write, '../psql -p 2070 super');
print STDOUT $pid . "\n";
$child_write->autoflush(1);

my $output1;
my $theCommands = "set schema 'super'; \n select count(*) from MyTable;";
print $child_write $theCommands;
close($child_write);

print "About to try and get query results. \n";
while (<$child_read>)
{
    print "$_";
}

以上代码有效。我得到了查询的结果,但我能够执行SQL命令的唯一方法是关闭$ child_write文件句柄。如果我不关闭它,那么程序在尝试读取行时会挂起。

如何在不关闭$ child_write文件句柄的情况下将SQL命令发送到Postgres客户端?

这是Looking for help to send queries to Postgres from Perl的后续问题。

1 个答案:

答案 0 :(得分:2)

您确定刷新了输出,但是您没有确保psql做同样的事情。您可以使用伪tty将其欺骗为flush。如果您想继续自动psql,可能需要Expect

更简单,更健壮的方法是使用DBI