gpt4 book ai didi

perl - mod_perl 并在子进程中继承 STDIN

转载 作者:行者123 更新时间:2023-12-04 19:23:57 25 4
gpt4 key购买 nike

我有这个旧的 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 中的 POST 数据。我还尝试生成一个测试 Perl 脚本而不是 Java 应用程序,但这也没有获得父脚本的 STDIN。

从描述来看,来自 Apache2::SubProcess 的 spawn_proc_prog 可以解决问题(即将 POST 数据作为 STDIN 传递给子进程并取回子进程的输出),但如果我运行任何东西,它似乎不起作用另一个 Perl 脚本。

有什么办法可以让子进程继承父脚本的STDIN?我可以在 Perl 脚本中读取流并将其内容作为命令行参数传递,但我认为这会受到命令行长度限制,有时可能会有很多数据(如图片),所以我真的很想弄清楚如何继承流。

最佳答案

哇,我希望这是来自客户端的低容量负载。在 mod_perl 中,您的标准输入与客户端的套接字句柄相关联,并且与标准输出相同。因此,要将您的 STDOUT 设置为 java 进程,您需要将 *STDOUT 设置为 Java 服务器的套接字句柄,或者在您的情况下,因为您正在打开一个进程,所以选择 STDOUT 并可能还通过设置 $| 使其无缓冲。此外,当您想要将数据流式传输回客户端时,您需要直接写入客户端的套接字句柄或将 STDOUT 重置回其原始值。

关于perl - mod_perl 并在子进程中继承 STDIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1752795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com