LINUX.ORG.RU

perl обработка stdout and stdin сторонней проги


0

0

я хочу запускать программу и управлять её stdout & stdinput из 
своей программы. Написал следующий код, но он вылетает сразу 
после первой команды со словами Broken Pipe:

#!/usr/bin/perl -w

use IPC::Open2;
use strict;

my ($pid1,$line);
my $pid = open2(*RD, *WR, '/home/victor/roof/lmox1');

if ($pid1 = fork) {   # fork dlya 2-x process, v etom
                      # pishu na stdin my_program
  while(<STDIN>){     # chitayu vvod s kezboard
    print WR $_,"\n"; # pishu vvod so STDIN v my_program;
  }
  waitpid($pid1,0);
} else {
                      # v etom process chitayu stdout my program
  die "cannot fork: $!" unless defined $pid;
  while(<RD>){
#    next unless /\S/;
    print $_;
  }
  print "tut\n";      # vihodit tut posle pervoj komandy
  exit;
}

Может, быть, дело в том, что while(<RD>) работает только 
пока <RD> defined? А как тогда сделать так, чтобы while(<RD>) 
работал так-же как и while(<STDIN>) ?

Спасибо!
☆☆

вобщем, имхо, проблема в том, чтобы второй процесс после прочтения данных не закрывал файловый дескриптор RD, открытый в первом процессе. А он, почему-то, это делает.

vilfred ☆☆
() автор топика

Вот, немного изменил пример, чтобы всё было правильно. 
Хотя и исходная программа у меня работала нормально.. 
Надо наверное разбираться с /home/victor/roof/lmox1

#!/usr/bin/perl -w
use IPC::Open2;
use strict;

my ($pid1,$line);
my $pid = open2(*RD, *WR, 'cat');

if ($pid1 = fork) {
  close(RD);
  while(<>){
    print WR;
  }
  close(WR);
  waitpid($pid1,0);
} else {
  die "cannot fork: $!" unless defined $pid;
  close(WR);
  while(<RD>){
    print;
  }
}

Обратите внимание на закрытие дескрипторов. 
И ещё, при <STDIN> в $_ обычно заносится \n, 
поэтому когда вы пишете print WR $_, "\n", то посылается 2 перевода строки.

> вобщем, имхо, проблема в том, чтобы второй процесс после 
> прочтения данных не закрывал файловый дескриптор RD, 
> открытый в первом процессе. А он, почему-то, это делает.
Нет, проблема не в этом, при fork-е файловые дескрипторы копируются и закрытие одного
не означает закрытие другого.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

хм... по видимому, дело все в lmox, ибо я через твою, в частности, прослойку между юзером и командной строкой запустил /bin/bash и оно работает, копирует файлы и т.п. Однако, при запуске lmox'a, оно опять вылетает со словом Broken Pipe.

Спасиб корое за ответ :)

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