首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mod_perl及其在子进程中的继承

问mod_perl及其在子进程中的继承
EN

Stack Overflow用户
提问于 2009-11-18 08:15:30
回答 1查看 657关注 0票数 0

我有一个旧的Perl脚本,它应该充当基于HTTP的客户机和非HTTP Java服务器之间的代理:客户机将一些数据发送到这个Perl脚本,该脚本反过来调用Java服务器,获取响应并将其返回给客户机。

Perl部分像这样调用服务器:

代码语言:javascript
复制
$servervars = "-DREMOTE_HOST=$ENV{'REMOTE_HOST'}"; 
#(a few other server variables passed this way)

system "java $servervars -cp /var/www javaserver";

然后Java服务器就会:

代码语言:javascript
复制
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脚本中读取流,并将其内容作为命令行参数进行传递,但我认为这会受到命令行长度限制的影响,而且有时会有很多数据(比如图片),所以我真的想弄清楚如何继承流。

EN

回答 1

Stack Overflow用户

发布于 2009-11-18 08:40:45

哇,我希望这是来自客户端的低容量负载。在mod_perl中,您的标准输入与客户端的套接字句柄绑定在一起,与标准输出相同。因此,要将STDOUT设置为java进程,您需要将*STDOUT设置为Java服务器的套接字句柄,或者在您的示例中,因为您正在打开一个进程,所以执行select STDOUT操作,并可能通过设置$|使其不缓冲。此外,当您想要将数据传输回客户端时,您需要直接写入客户端的套接字句柄,或者将STDOUT重置为其原始值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1752795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档