Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在不关闭进程的情况下将命令发送到进程?_Perl - Fatal编程技术网

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

Perl 如何在不关闭进程的情况下将命令发送到进程?,perl,Perl,我正在尝试启动一个Postgres客户机,并将其保留,以便可以向其发送几个SQL命令,并收集每个命令的结果。我当前的问题是,除非关闭用于发送命令的文件句柄,否则第一组命令似乎不会发送到进程。但是关闭文件句柄违背了程序的全部目的 代码如下: my ($child_read, $child_write); our $pid = open2($child_read, $child_write, '../psql -p 2070 super'); print STDOUT $pid . "\n"; $c

我正在尝试启动一个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 "$_";
}
my($child\u read,$child\u write);
我们的$pid=open2($child_read,$child_write,'../psql-p2070 super');
打印标准输出$pid。“\n”;
$child_write->autoflush(1);
我的$output1;
my$theCommands=“设置架构‘super’;\n从MyTable中选择count(*)”;
打印$child\u写入$commands;
关闭($child_write);
打印“即将尝试获取查询结果。\n”;
而()
{
打印“$”;
}
上述代码有效。我得到了查询的结果,但得到要执行的SQL命令的唯一方法是关闭$child\u write文件句柄。如果我不关闭它,那么程序在尝试读取行时将挂起

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


这是的后续问题。

您确保刷新了输出,但没有确保
psql
也执行了相同的操作。您可以通过使用伪tty将其诱骗到flush。如果您想继续自动
psql
,这可能是一种方法


更简单、更健壮的方法是使用。

您能使用postgres驱动程序而不是处理流程和管道吗?更多:现在链接已经修复,我看到已经向您推荐了DBI和DBD::Pg。对于这个用例,我非常推荐它。如果您仍然选择使用IPC,非阻塞读取将对您更有帮助。也许您可以使用IO::Select。阅读此讨论线程了解更多信息:感谢链接到非阻塞管道开放线程。这很有帮助,谢谢你的解释。这是有道理的。我一直在查阅有关open2和close的在线文档,试图找出是否有方法刷新输出。我没有关注我这边的刷新和psql这边的刷新之间的区别。我会退房的。