URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1548
[ Назад ]

Исходное сообщение
"Как передавать данные на stdin другой программы?"

Отправлено Michael , 02-Апр-03 10:31 
Подскажите, плиз, как в Перле передать данные на stdin и прочитать stdout другой программы? по образу и подобию того, как делает сквид со своими редиректорами...

Содержание

Сообщения в этом обсуждении
"Как передавать данные на stdin другой программы?"
Отправлено konst , 02-Апр-03 12:19 
>Подскажите, плиз, как в Перле передать данные на stdin и прочитать stdout
>другой программы? по образу и подобию того, как делает сквид со
>своими редиректорами...
Может так?
open(PROGRAM_NEW, "| prog_name");
print PROGRAM_NEW "то что надо передать";
close (PROGRAM_NEW);


"Как передавать данные на stdin другой программы?"
Отправлено konst , 02-Апр-03 12:20 
>Подскажите, плиз, как в Перле передать данные на stdin и прочитать stdout
>другой программы? по образу и подобию того, как делает сквид со
>своими редиректорами...
Может так?
open(PROGRAM_NEW, "| prog_name");
print PROGRAM_NEW "то что надо передать";
close (PROGRAM_NEW);


"Как передавать данные на stdin другой программы?"
Отправлено Michael , 02-Апр-03 12:50 
>>Подскажите, плиз, как в Перле передать данные на stdin и прочитать stdout
>>другой программы? по образу и подобию того, как делает сквид со
>>своими редиректорами...
>Может так?
>open(PROGRAM_NEW, "| prog_name");
>print PROGRAM_NEW "то что надо передать";
>close (PROGRAM_NEW);
я не совсем это имел ввиду...
я хочу сделать так - некая прога,которая запущена моей прогой на Перле, в цикле крутится и ждет ввода строки на stdin, переваривает и выдает результат на stdout, потом опять возвращается к ожиданию ввода...
т.е. она стартует только один раз, а строк переваривает много!
т.е. задач фактически несколько:
1) запустить прогу и прицепиться к ее stdin и stdout
2) послать ей строку - много раз
3) забрать у нее строку - тоже много раз
4) убить прогу - надеюсь и сам сумею :)

хотя бы подскажите функции, которые смотреть...


"Как передавать данные на stdin другой программы?"
Отправлено k8 , 02-Апр-03 13:18 
для этого подчиненная программа должна предусматривать такое. типа как на перле:
while (<>){
# цикл обработки ввода
}
а если не так то надо будет в цикле открывать и закрывать ....

"Как передавать данные на stdin другой программы?"
Отправлено Michael , 02-Апр-03 15:11 
>для этого подчиненная программа должна предусматривать такое. типа как на перле:
>while (<>){
># цикл обработки ввода
>}
>а если не так то надо будет в цикле открывать и закрывать
>....

это все уже есть и отлажено...
осталось как-то прикрутить это...


"Как передавать данные на stdin другой программы?"
Отправлено XMan , 02-Апр-03 16:30 
Для надежности можно седлать цикл:

while (<STDIN>) {
    ...
};

Если скрипту были переданы какие-нибудь параметры в командной строке, то в операции "ромб" (<>) они буду восприниматься, как файлы из которых читать строки.


"Как передавать данные на stdin другой программы?"
Отправлено Michael , 02-Апр-03 19:06 
>Для надежности можно седлать цикл:
>
>while (<STDIN>) {
> ...
>};
>
>Если скрипту были переданы какие-нибудь параметры в командной строке, то в операции "ромб" (<>) они буду восприниматься, как файлы из которых читать строки.

это все сделано и работает!
мне надо написать внешнюю, вызывающую программу!
т.е. вопрос не принять из stdin и послать на stdout, а _послать_ на _чужой_ stdin и _принять_ с _чужого_ stdout !


"Как передавать данные на stdin другой программы?"
Отправлено XMan , 02-Апр-03 21:04 
Незнаю, как средствами perl сделать поток входа и выхода на внешнюю программу одновременно, но можно использовать стандартную схему C/C++. То есть, делается 2 pipe-а для получения READHANDLE и WRITEHANDLE. Далее делается fork и в потомке перенаправляются потоки примерно так:

open(STDOUT, ">&WRITEHANDLE1");
open(STDIN, ">&READHANDLE2");

а в родителе работаешь с READHANDLE1 и WRITEHANDLE2 для чтения (из STDOUT программы) и записи (в STDIN программы) соответственно. После этих манипуляций в потомке говоришь:

exec "чего_запускать" массив_аргументов

и получаешь то, что хочешь... теоретически :)


"Как передавать данные на stdin другой программы?"
Отправлено pth , 03-Апр-03 00:12 
>Подскажите, плиз, как в Перле передать данные на stdin и прочитать stdout
>другой программы? по образу и подобию того, как делает сквид со
>своими редиректорами...

perldoc IPC::Open2