Crea una tubería como lo haría tu caparazón.
Aquí está nuestra cadena de miedo:
my $str = "foo * ~ bar \0 baz *";
Vamos a desarrollar nuestro canal hacia atrás, por lo que primero nos reunimos la salida del programa Java:
my $pid1 = open my $fh1, "-|";
die "$0: fork: $!" unless defined $pid1;
if ($pid1) {
# grab output from Java program
while (<$fh1>) {
chomp;
my @c = unpack "C*" => $_;
print "$_\n => @c\n";
}
}
Nota el especial "-|"
argumento para Perl de open
operador.
Si abre un tubo en el comando '-'
, es decir, ya sea '|-'
o '-|'
con 2-argumentos (o 1-argumento) forma de open()
, entonces hay una implícita fork
hecho, y el valor de retorno de open
es el pid del hijo dentro del proceso principal, y 0
dentro del proceso hijo ... El manejador de archivo se comporta normalmente para el elemento primario, pero la E/S de ese identificador de archivo se canaliza desde/al STDOUT
/STDIN
del proceso secundario.
El unpack
está ahí para echar un vistazo en el contenido de los datos leídos de la tubería.
En su programa, tendrá que ejecutar el programa Java, pero el siguiente código utiliza un facsímil razonable:
else {
my $pid2 = open my $fh2, "-|";
die "$0: fork: $!" unless defined $pid2;
if ($pid2) {
$| = 1;
open STDIN, "<&=" . fileno($fh2)
or die "$0: dup: $!";
# exec "java", "-jar", "java_program.jar";
# simulate Java program
exec "perl", "-pe", q(
BEGIN { $" = "][" }
my @a = split " ", scalar reverse $_;
$_ = "[@a]\n";
);
die "$0: exec failed";
}
Por último, el humilde nieto simplemente imprime la cadena de miedo (que llega a la norma entrada del programa Java) y salidas. Al establecer $|
en un valor verdadero, se limpia el identificador de archivo seleccionado actualmente y se lo coloca en modo sin búfer.
else {
print $str;
$| = 1;
exit 0;
}
}
Su salida:
$ ./try
[*][zab][][rab][~][*][oof]
=> 91 42 93 91 122 97 98 93 91 0 93 91 114 97 98 93 91 126 93 91 42 93 91 111 111 102 93
Tenga en cuenta que la NUL sobrevive el viaje.
Eso se ve genial, pero ¿cómo obtengo el resultado del comando? – spudly
@spudly, no se puede con esa recomendación. Debería usar open2(), comprobar perlc perlipc para "comunicación bidireccional" – jsoverson
Muchos usos de open2 o open3 en sistemas Windows se ven fatalmente obstaculizados por el hecho de que solo puede 'seleccionar' contra un socket en Win32. Si no está en Windows o el bloqueo está bien, entonces open2 o open3 pueden hacer el truco para usted. – daotoad