我有这个旧的 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(...);
问题是,当 Perl 脚本通过 CGI 调用时,这工作得很好,但如果 Perl 脚本由 mod_perl(实际上是 mod_perl2)处理,则根本不起作用。显然,Java 部分没有从 Perl 中获取 STDIN(serverData.available() 返回 0),并且 Perl 没有返回 STDOUT。后者可以通过执行 print `java...`(即反引号)而不是系统“java...”来解决,但我不知道如何处理 STDIN。
Perl 脚本本身能够读取 STDIN 中的 POST 数据。我还尝试生成一个测试 Perl 脚本而不是 Java 应用程序,但这也没有获得父脚本的 STDIN。
从描述来看,来自 Apache2::SubProcess 的 spawn_proc_prog 可以解决问题(即将 POST 数据作为 STDIN 传递给子进程并取回子进程的输出),但如果我运行任何东西,它似乎不起作用另一个 Perl 脚本。
有没有办法让子进程继承父脚本的STDIN?我可以在 Perl 脚本中读取流并将其内容作为命令行参数传递,但我认为这会受到命令行长度限制,有时可能会有很多数据(如图片),所以我真的很想弄清楚如何继承流。