Вы не объяснили, почему существующий сценарий 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);