Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Как запускать процессы через IPC?


Автор: RainMan 26.5.2006, 09:58
Здравствуйте!

Подскажите пожалуйста как все таки правильно пользоваться IPC::Open2 ? Для всех ли приложений можно открыв процесс послыть комманды на выполнение?

Видел примеры выполнения скриптов через IPC которые пользуются простенькими программами - тут все ясно. А как быть с программами посложнее?


Код

use IPC::Open2 qw(open2);


    $SIG{PIPE} = sub { die "bc exited prematurely\n" };

    $pid = open2 READ, WRITE, 'bc';

    foreach $expression (qw(2+2 1^0 1/0)) {

        print WRITE "$expression\n"             or die $!;

        defined($result = <READ>)               or die $!;

        chomp $result;

        print "$expression = $result\n"         or die $!;

    }

    close WRITE                 or die $!;

    close READ                  or die $!;

    waitpid($pid, 0) == $pid    or die $!;

    $? == 0                     or die "return status $? from bc\n"; 



тут все понятно - есть программа "bc" на вход которой подставляют выражения..


а вот мне хотелось бы проделать вот какую вещь:

у меня есть программа Nedit (текстовый редактор, вы в курсе я думаю). запускается как "nedit <file_name>"

Каким образом можно открыть этот текстовый редактор и через комманду Print напечатать в доккументе какое нибудь слово?

Такое возможно вообще? 


такой вот код не прокатывает.. открывается просто текстовый редактор, но в нем ничего не появляется..

Код

use IPC::Open2 qw(open2);


    $SIG{PIPE} = sub { die "bc exited prematurely\n" };

    $pid = open2 READ, WRITE, 'nedit';

    foreach $expression (qw("hello" "hello again")) {

        print WRITE "$expression\n"             or die $!;

        defined($result = <READ>)               or die $!;

        chomp $result;

        print "$expression = $result\n"         or die $!;

    }

    close WRITE                 or die $!;

    close READ                  or die $!;

    waitpid($pid, 0) == $pid    or die $!;

    $? == 0                     or die "return status $? from bc\n"; 




Спасибо. 

Автор: RainMan 27.5.2006, 20:49
Ни у кого нет никаких вариантов??? 

Автор: sharq 9.6.2006, 10:24
RainMan, попробуй открыть через pipe обычной командой open. 

Автор: RainMan 9.6.2006, 10:33
Извиняюсь может за глупый вопрос но это как?  smile 

Автор: sharq 12.6.2006, 19:50
RainMan, почитай perldoc -f open и про pipe (трубы).

Не знаю, умеет ли nedit обрабатывать STDIN. 
Вот пример с использованием моей программы:
Код

#!perl

use strict;

open my $fh, '|-', 'perl test.pl' or die "Can't open file: $!";
print $fh "hello\n";
print $fh "i'm sharq!\nbye-bye\n\n";


А вот сама программа, которая обрабатывает STDIN - test.pl.
Код

#!perl

use strict;

while (<>) {
    chomp;
    print "test: $_\n";
}


Вот результат работы.
Цитата

C:\>perl example.pl
test: hello
test: i'm sharq!
test: bye-bye
test:


 smile  

Автор: RainMan 12.6.2006, 20:00
sharq, спасибо за совет... почитал про эти функции, правда про них я уже знаю, тока не в курсе был что это pipe зовется smile

Твой код работает отлично. Забудем про nedit пока, он явным образом не работает с stdin у меня есть другая прога которая с ним работает. Однако она грузится очень долго (из-за получения лицензий + много плагинов в себе имеет всяческих.. в общем секунд 30-40 она грузится). Как бы дождаться того момента когда все это хозяйство загрузится и программа будет готова реагировать на комманды? 

Спасибо за помощь. 

Автор: sharq 12.6.2006, 21:29
RainMan, 
Цитата(RainMan @  12.6.2006,  21:00 Найти цитируемый пост)
Однако она грузится очень долго (из-за получения лицензий + много плагинов в себе имеет всяческих.. в общем секунд 30-40 она грузится). Как бы дождаться того момента когда все это хозяйство загрузится и программа будет готова реагировать на комманды? 

подождать 30-40 секунд  smile 
Откуда я могу знать, о какой ты программе говоришь и как я тебе могу дать совет?

Что это за программа, которая так долго грузиться, даже ОС быстрей загружается. 

 smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)