我有一个旧的Perl脚本,它应该充当基于HTTP的客户机和非HTTP Java服务器之间的代理:客户机将一些数据发送到这个Perl脚本,该脚本反过来调用Java服务器,获取响应并将其返回给客户机。
Perl部分像这样调用服务器:
$servervars = "-DREMOTE_HOST=$ENV{'REMOTE_HOST'}";
#(a few other server variables passed this way)
system "java $servervars -cp /var/www javaserver";然后Java服务器就会:
InputStream serverData = System.in;
serverData.read(); //and read, and read it on
//....
//print response:
System.out.print("Content-type: application/octet-stream\n\n");
System.out.write(...);问题是,当通过CGI调用Perl脚本时,这种方法工作得很好,但如果Perl脚本由mod_perl (实际上是mod_perl2)处理,则根本不起作用。显然,Java部分不能从Perl获取STDIN (serverData.available()返回0),Perl也不能获取STDOUT。后者可以通过执行print java... (即反标记)来解决,而不是系统"java...",但我不知道如何处理STDIN。
Perl脚本本身能够读取STDIN中的POSTed数据。我还尝试生成一个测试Perl脚本,而不是Java应用程序,这也没有获得父脚本的STDIN。
根据描述判断,来自Apache2::SubProcess的spawn_proc_prog可以完成这项工作(即,将POST数据作为STDIN传递给子进程,并返回子进程的输出),但如果我只运行另一个Perl脚本,它似乎就不起作用了。
有没有办法使子进程继承父脚本的STDIN?我可以在Perl脚本中读取流,并将其内容作为命令行参数进行传递,但我认为这会受到命令行长度限制的影响,而且有时会有很多数据(比如图片),所以我真的想弄清楚如何继承流。
发布于 2009-11-18 08:40:45
哇,我希望这是来自客户端的低容量负载。在mod_perl中,您的标准输入与客户端的套接字句柄绑定在一起,与标准输出相同。因此,要将STDOUT设置为java进程,您需要将*STDOUT设置为Java服务器的套接字句柄,或者在您的示例中,因为您正在打开一个进程,所以执行select STDOUT操作,并可能通过设置$|使其不缓冲。此外,当您想要将数据传输回客户端时,您需要直接写入客户端的套接字句柄,或者将STDOUT重置为其原始值。
https://stackoverflow.com/questions/1752795
复制相似问题