J'essaie de communiquer avec un processus interactif. Je veux que mon script perl soit un "moddle man" entre l'utilisateur et le processus. Le processus met le texte à stdout, invite l'utilisateur à une commande, met plus de texte à stdout, invite l'utilisateur à une commande, ....... Un graphique primitive est fourni:Perl bidirectionnel IPC de tuyau, comment éviter la mise en mémoire tampon de sortie
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
Les Simule suivants ce que j'essaie de faire:
#!/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;
}
Du fait de la mise en mémoire tampon de sortie, l'exemple ci-dessus ne fonctionne pas. Quel que soit le texte tapé ou le nombre d'entrées pressées, le programme se trouve juste là. La façon de le fixer est d'émettre:
my $pid = open2(\*READER, \*WRITER, "cat -un");
avis « -UN de chat » par opposition à un « cat -n ». -u désactive la bufferisation de sortie sur cat. Lorsque la mise en mémoire tampon de sortie est désactivée, cela fonctionne. Le processus que j'essaie d'interagir avec les buffers les plus probables est le suivant car je suis confronté aux mêmes problèmes avec "cat -n". Malheureusement, je ne peux pas désactiver la mise en mémoire tampon de sortie sur le processus avec lequel je communique, alors comment gérer ce problème?
Update1 (en utilisant 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;
}
~
'open2' ouvre toujours ses propres tuyaux, vous ne pouvez pas donner Ptyś. Voir http://www.perlmonks.org/?node_id=835953 pour un exemple simple qui utilise 'IO :: Pty :: Easy'. – Barmar