你没有解释为什么现有的 perl 脚本不能直接从 Perl/CGI 脚本运行?这对我来说似乎是最简单的途径,因为它不涉及创建另一个沟通渠道:
client ⇒ apache ⇒ your CGIzed existing script ⇒ embedded system
相对于:
client ⇒ apache ⇒ new CGI script ⇒ existing script ⇒ embedded system
我假设原因是您希望 CGI 脚本同时运行多次,而嵌入式系统无法处理多个连接。
但即使在这种情况下,为了序列化的唯一目的而拥有一个守护进程似乎有点过分了。您可以在 CGI 脚本中使用锁来保护关键的通信代码,如下所示:
open(my $lock, ">", $lockfilename);
flock($lock, LOCK_EX);
... critical code...
flock($lock, LOCK_UN);
请注意,“关键代码”部分可以嵌入您现有的脚本,也可以执行它。
如果尽管如此,您仍想将 CGI 与命令守护程序分开,这里是基于套接字通信的客户端和服务器部分的模板。首先是客户端,它是 CGI 的一部分:
use IO::Socket::INET;
$sock = IO::Socket::INET->new('localhost:9000');
print $sock "Comand\n";
$result = <$sock>;
... do something with the result ...
$sock->close;
这是主要的守护程序循环:
package MyServer;
use base Net::Server;
sub process_request {
my $self = shift;
while (<STDIN>) {
chomp;
print "This is my answer to the command '$_'.\r\n";
}
}
MyServer->run(port => 160);