diff options
author | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-07-16 02:38:18 +0000 |
---|---|---|
committer | graehl <graehl@ec762483-ff6d-05da-a07a-a48fb63a330f> | 2010-07-16 02:38:18 +0000 |
commit | f57dde37dfb1d98b5ff9f5d1716687c690e4b4ba (patch) | |
tree | 20f70773ebec3bc14f982c5504fd239d21d00ae7 | |
parent | 8b26fcd27aae78bf17d356e2677a9e7e62e7d1b2 (diff) |
hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication
git-svn-id: https://ws10smt.googlecode.com/svn/trunk@281 ec762483-ff6d-05da-a07a-a48fb63a330f
-rwxr-xr-x | vest/line_mediator.pl | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/vest/line_mediator.pl b/vest/line_mediator.pl new file mode 100755 index 00000000..defc11e8 --- /dev/null +++ b/vest/line_mediator.pl @@ -0,0 +1,35 @@ +#!/usr/bin/perl -w +#hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication + +# if you don't know how to fork/exec in a C program, this could be helpful under limited cirmustances (would be ok to liaise with sentserver) + +use strict; +use IPC::Open2; +$,=' '; +my $quiet=$ENV{QUIET}; +sub info { + print STDERR @_ unless $quiet; +} + +my @c1; +do { + push @c1,shift +} while $c1[$#c1] ne '--'; +pop @c1; +my @c2=@ARGV; +(scalar @c1 && scalar @c2) || die "usage: $0 cmd1 args -- cmd2 args; hooks up two processes, 2nd of which has one line of output per line of input, expected by the first, which starts off the communication. crosses stdin/stderr of cmd1 and cmd2 line by line (both must flush on newline and output. cmd1 initiates the conversation (sends the first line). QUIET env var suppresses debugging output."; +info("1 cmd:",@c1,"\n"); +info("2 cmd:",@c2,"\n"); +my ($R1,$W1,$R2,$W2); +my $c1p=open2($R1,$W1,@c1); # Open2 R W backward from Open3. +my $c2p=open2($R2,$W2,@c2); +select $W2; +$|=1; +while(<$R1>) { + info("1:",$_); + print $_; + $_=<$R2>; + last unless defined $_; + info("2:",$_); + print $W1 $_; +} |