OVH Cloud OVH Cloud

Pty et pipe

2 réponses
Avatar
Vincent Lefevre
Bonjour,

Je voudrais faire quelque chose de similaire à open2, mais en
utilisant un pty (avec IO::Pty) à cause des problèmes de buffer.
Comment faire?

D'après ce que j'ai vu sur Google Groupes, ça serait un truc
du style:

my $pty = new IO::Pty;
my $pid = fork;
defined $pid or die;
unless ($pid) # child
{
*SLAVE = $pty->slave();
open STDIN, "<&SLAVE" or die;
open STDOUT, ">&SLAVE" or die;
exec 'grep', '--color=always', ';';
die;
}
foreach my $i (1..200)
{
print $pty "$i;\n";
$_ = <$pty>;
print;
}

mais ça ne passe pas par le grep (';' non coloré).

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

2 réponses

Avatar
Vincent Lefevre
Dans l'article <20060414144522$,
Vincent Lefevre <vincent+ écrit:

Je voudrais faire quelque chose de similaire à open2, mais en
utilisant un pty (avec IO::Pty) à cause des problèmes de buffer.


Juste pour dire que j'ai réussi avec IPC::Run.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Vincent Lefevre
Dans l'article <20060414172830$,
Vincent Lefevre <vincent+ écrit:

Dans l'article <20060414144522$,
Vincent Lefevre <vincent+ écrit:

Je voudrais faire quelque chose de similaire à open2, mais en
utilisant un pty (avec IO::Pty) à cause des problèmes de buffer.


Juste pour dire que j'ai réussi avec IPC::Run.


En fait, il y a un problème d'écho non déterministe: la chaîne fournie
en entrée apparaît généralement en double sur la sortie, mais parfois
en simple. Dans l'exemple ci-dessous, la sortie correspond à ce qu'il
y a entre crochets. Pour le dernier maple_wr, la sortie apparaît en
simple.

--> maple_wr(r := (err0 &/ err) &* 100: err := err &- err0:)
--> [r := (err0 &/ err) &* 100: err := err &- err0: EndOfInput:
]
--> [r := (err0 &/ err) &* 100: err := err &- err0: EndOfInput:
r := (err0 &/ err) &* 100: err := err &- err0: EndOfInput:
]
--> maple_wr OK
--> maple_wr(floor(r[1]);)
--> [
floor(r[1]); EndOfInput:
]
--> [
floor(r[1]); EndOfInput:
floor(r[1]); EndOf]
--> [
floor(r[1]); EndOfInput:
floor(r[1]); EndOfInput:
33
]
--> maple_wr OK
--> maple_wr(ceil(r[2]);)
--> [ceil(r[2]); EndOfInput:
]
--> [ceil(r[2]); EndOfInput:
34
]

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA