インタラクティブなプロセスと通信しようとしています。私は自分の perl スクリプトをユーザーとプロセスの間の "モドルマン" にしたいと考えています。プロセスは、テキストを stdout に出力し、ユーザーにコマンドを要求し、さらにテキストを stdout に出力し、ユーザーにコマンドを要求します。....... プリミティブ グラフィックが提供されます。
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
User <----STDOUT---- interface.pl <-----STDOUT--- Process
User -----STDIN----> interface.pl ------STDIN---> Process
以下は、私がやろうとしていることをシミュレートします:
#!/usr/bin/perl
use strict;
use warnings;
use FileHandle;
use IPC::Open2;
my $pid = open2( \*READER, \*WRITER, "cat -n" );
WRITER->autoflush(); # default here, actually
my $got = "";
my $input = " ";
while ($input ne "") {
chomp($input = <STDIN>);
print WRITER "$input \n";
$got = <READER>;
print $got;
}
上記の例では出力バッファリングが機能しません。どのようなテキストが入力されても、何回エンターが押されても、プログラムはそこにとどまります。それを修正する方法は、発行することです:
my $pid = open2( \*READER, \*WRITER, "cat -un" );
「cat -n」だけではなく、「cat -un」に注意してください。-u は、cat での出力バッファリングをオフにします。出力バッファリングがオフになっている場合、これは機能します。「cat -n」で同じ問題に直面しているため、最も可能性の高いバッファ出力と対話しようとしているプロセス。残念ながら、通信しているプロセスの出力バッファリングをオフにすることはできません。この問題をどのように処理すればよいですか?
UPDATE1 (ptty を使用):
#!/usr/bin/perl
use strict;
use warnings;
use IO::Pty;
use IPC::Open2;
my $reader = new IO::Pty;
my $writer = new IO::Pty;
my $pid = open2( $reader, $writer, "cat -n" );
my $got = "";
my $input = " ";
$writer->autoflush(1);
while ($input ne "") {
chomp($input = <STDIN>);
$writer->print("$input \n");
$got = $reader->getline;
print $got;
}
〜