LINUX.ORG.RU

C++, Perl and pipe


0

0

Нужно организовать межпроцессное взаимодействие между программой на C++ и программой на Perl. Причем прога на С++ - родительский процесс, прога на Perl - дочерний.
Между дочерним и родительским процессами легче всего организовать обмен через неименованные каналы (pipe). На С++ этоя сделаю легко. А здесь как?
Прога на С++ (parent.cpp):
pipe (fd);
int p = fork ();
if (p == 0)
{
while (1)
{
write (fd [0], "HELLO", sizeof ("HELLO"));
}
exit (0);
}
else
{
if (execl ("child", NULL) == -1)
{
printf ("Error\n");
exit (1);
}
}
Прога на Perl (child.pl):
#!/usr/bin/perl -w
open (fHandler, "parent |");
while (1)
{
$text = readline (*fHandler);
print $text;
}
close (fHandler);
Если запустить 'parent', то в системе появляется больше сотни процессов 'child', их состояние - piperd. Если не предпринять никаких мер, система повиснет. Если запустить 'child' - тоже самое. Значит проблема в коде на Perl. HELP PLEASE.

С уважением

anonymous

perldoc open В строке с open вы запускаете еще один экземпляр родителя и присасываетесь к его стдауту - далее понятно, что происходит. Вам надо к.л. передать дескриптор пайпа в перловскую прогу.

anonymous
()

Voobshe-to govorja(ludi Perl rugaut zrja:) Perl podderzhivaet name-to -name API dlja sootvetstvuushih syscalls.

T.e. v Perle est' i pipe() i read(sysread) i write(syswrite). Poetomu mozhno organizovat' sovershenno analogichnyi cycle v Perle.

Voobshe by neploho zagljanut' v Perl Cookbook - tam est' primery kak raz dlja podobnogo sluchaja.

Hm.. Voobshe, dannyi code erundu kakuu-to delaet.. Poprobui na slovah napisat', chto ty pytaesh'sja poluchit' v rezul'tate?

Seichas etot code prosto sozdaet:

Parent->child->parent->child->parent->....

I tak do ischerpanija resursov...

HINT: man socketpair, perldoc perlipc

BaT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.