Si se asigna la cadena ' IGNORE ' a la correspondiente entrada $SIG{KINDOFSIGNAL}
Perl descartará la señal. Algunas señales no pueden ser ignoradas (por ejemplo,
KILL y STOP ). Cuando cambie el manejador de una señal recuerde
usar local
para asegurar
que el anterior manejador será restaurado una vez terminado el ámbito.
pp2@nereida:~/src/perl/perl_networking/ch2$ cat -n write_ten_i.pl 1 #!/usr/bin/perl -w 2 use strict; 3 4 local $SIG{PIPE} = 'IGNORE'; 5 6 open (PIPE,"| ./read_three.pl") or die "Can't open pipe: $!"; 7 select PIPE; $|=1; select STDOUT; 8 9 my $count=0; 10 for (1..10) { 11 warn "Writing line $_\n"; 12 unless (print PIPE "This is line number $_\n") { 13 warn "An error occurred during writing: $!\n"; 14 $count = $_-1; 15 last; 16 } 17 sleep 1; 18 } 19 close PIPE or die "Can't close pipe: $!"; 20 21 print "Wrote $count lines of text\n";
En la línea 12 se hace uso de la propiedad de print
de devolver 1 si la impresión se realizó con éxito.
Al ejecutar obtenemos:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./write_ten_i.pl Writing line 1 Read_three got: This is line number 1 Writing line 2 Read_three got: This is line number 2 Writing line 3 Read_three got: This is line number 3 Writing line 4 An error occurred during writing: Tubería rota Wrote 3 lines of textNótese como el mensaje de la línea 13 produce el volcado de la variable
$!
en español.
Nótese también que no se produce error en el close PIPE
.
Para mas información sobre las señales
véase perldoc perlipc
.
Casiano Rodríguez León