1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#!/usr/bin/perl use warnings; use strict; my $tstart = time(); my $t; print "Please wait (five seconds).\n"; while(1) { $t = time() - $tstart; if ($t >= 5) { print "Five seconds reached.\n"; last; } }
1 2 3 4 5 6 7 8
use IO::Select; my $s = IO::Select->new(\*STDIN); while (1) { if ($s->can_read(1)) { my $foo = <STDIN>; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
eval { # das eval-block "sterben lassen" (verlassen) wenn ALARM ausgelöst wird: local $SIG{ALRM}=sub{ die() }; # 10 Sekunden Warten alarm(10); #lesen von STDIN while (<>) { chomp; ... # 10 Sekunden Warten Timer zurück setzen alarm(10); } # kein Alarm alarm(0); }; # kein Alarm alarm(0); ...
./readstream --timeout 3 -- ./datastream --interval 5
1
2
3
4
5
6
7
8
9
10
11
12
pid 4964 : ./datastream -int 5
READ: Wed Sep 23 23:56:03 2015
ALARM received!
pid 4965 : ./datastream -int 5
READ: Wed Sep 23 23:56:06 2015
ALARM received!
pid 4966 : ./datastream -int 5
READ: Wed Sep 23 23:56:09 2015
ALARM received!
pid 4967 : ./datastream -int 5
READ: Wed Sep 23 23:56:12 2015
^C
Linuxer(man beachte die steigende PID für datastream bei den Ausgaben)
LinuxerDas Lesen von einem Handle mit <> blockiert, bis da was ankommt.
2015-09-24T15:09:35 hlubenowLinuxer(man beachte die steigende PID für datastream bei den Ausgaben)
Bedeutet das, daß bei jedem Lesen eine neue Pipe zu datastream geöffnet wird?
perlensammler22ich weiß allerdings das Systembedingt von der "quelle" mindestens alle 4 Minuten etwas kommen muss.
Sollt das allerdings ausbleiben, möchte ich die quelle + meinperl.pl neu starten.
1 2 3 4 5 6 7 8 9 10 11 12
#!/usr/bin/perl use strict; use warnings; # datastream.pl - Print local time every three seconds. $| = 1; # unbuffered STDOUT while ( 1 ) { print scalar(localtime), "\n"; sleep 3; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#!/usr/bin/perl use warnings; use strict; # readstream.pl use Fcntl; fcntl(STDIN, F_SETFL, O_NONBLOCK); my $input; my $res; my $str = ""; my $reading = 0; my $notread = 0; while(1) { $res = sysread(STDIN, $input, 1); if (defined($res)) { $reading = 1; $str .= $input; if ($notread) { print "Unsuccessful attempts to read: $notread.\n"; } $notread = 0; } else { if ($reading == 1) { print $str; } $reading = 0; $notread++; $str = ""; } }
datastream.pl | readstream.pl