|
|||||||||||||||||||||||||||
Bjoern Bille Hoejte <sslug@sslug> writes:
> $rin = $rout = '';
> vec($rin, fileno(STDIN), 1) = 1;
> $readable = select($rout=$rin, undef, undef, 0) | -f $ARGV[0];
> if ($readable) {
> while (<>) {
> print;
> }
> } else {
> printf("No standard input detected\n");
> }
(
*Aldrig* brug printf hvis det ikke er nødvendigt. Det er en dårlig
vane og sløver programmet betragteligt ned.
)
Jeg ville foretrække at bruge IO::Select istedet. Følgende burde være
helt ækvivalent.
#!perl
use IO::Select;
my $s = new IO::Select (\*STDIN);
if ($s->can_read(0)) {
while(<>) {
...
}
} else {
print "No stdin\n";
__END__
En lidt anden måde at gøre det på er:
#!perl
# Hvis funktionen modtager en SIGALRM udføres funktionen time_out
sub time_out { die "TIME-OUT" }
$SIG{ALRM} = \&time_out;
eval {
alarm(1); # Få OS'et til at sende en SIGALRM om 1 sekund
while(<>) {
alarm(0) ; # Aflys ovenstående
...
}
}
if ($@ =~ /TIME-OUT/) {
print "No stdin\n"
}
__END__
Måske burde man lige sørge for at alarm(0) kun blev kaldt en gang.
Select-måden er nok pænest.
--
Peter Makholm | If you can't do any damage as root, are you still
sslug@sslug | really root?
http://hacking.dk | -- Derek Gladding about SELinux
|
||||||||||||||
|
||||||||||||||