Escriba un módulo que provea una función opennp
que retorna tres manejadores:
my ($fromme, $tome, $err) = opennp('metoexternal.p', 'externaltome.p', 'err.p', 'command par1 par2');
La función crea los tres pipes con nombre con los argumentos especificados lanza la
aplicación command par1 par2
con su output redirigido a externaltome.p
,
su input rederigido desde metoexternal.p
y su salida de errores a err.p
.
Los manejadores pueden ser entonces usados para comunicarse con la aplicación externa:
syswrite $fromme, $message;
Para lanzar el proceso de forma concurrente use fork. El seudocódigo sigue este esquema:
if ($pid = fork) { # father die "Can't fork" unless defined $pid; ... } else { # redirect STDOUT, STDIN and STDERR to named pipes exec('command par1 par2 > externaltome.p < metoexternal.p 2> err.p'); }
Lista de requisitos:
Makefile.PL
con objetivo cover
.
casiano@tonga:~/src/perl/pl/PL-Tutu$ cat Makefile.PL use strict; use warnings; use ExtUtils::MakeMaker; # Run 'make test' in those machines via SSH # Install GRID::Machine for target 'remotetest' my $REMOTETEST = 'remotetest.pl'; my $MACHINES = $ENV{MACHINES} || 'orion beowulf'; WriteMakefile( NAME => 'PL::Tutu', VERSION_FROM => 'lib/PL/Tutu.pm', # finds $VERSION PREREQ_PM => { 'Class::MakeMethods::Emulator::MethodMaker' => 0}, # e.g., Module::Name => 1.1 EXE_FILES => [ 'scripts/tutu' ], ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (ABSTRACT_FROM => 'lib/PL/Tutu.pm', # retrieve abstract from module AUTHOR => 'Casiano Rodriguez-Leon <casiano@ull.es>') : ()), ); sub MY::postamble { $_ = targets(); s/<<REMOTETEST>>/$REMOTETEST/ge; s/<<MACHINES>>/$MACHINES/ge; return $_; } sub targets { return <<'EOSQT'; coverage: cover -delete make HARNESS_PERL_SWITCHES=-MDevel::Cover test cover remotetest: dist <<REMOTETEST>> ${DISTVNAME}.tar.gz <<MACHINES>> myclean: veryclean cover -delete EOSQT }
Casiano Rodríguez León