Delay-Pipe?
Florian Lohoff
flo at rfc822.org
Mon Jun 24 12:06:02 CEST 2002
On Sun, Jun 23, 2002 at 11:05:21PM +0200, Cord Beermann wrote:
> Hallo.
>
> kennt jemand ein Tool was in etwa das macht:
>
> echo foo |delay 5
>
> das foo soll nach 5 Sekunden ausgegeben werden.
>
> bevor jetzt jemand mit sleep anfaengt, das Ziel ist, das ich viele
> Zeilen in zufaelligen Abstaenden in die Pipe werfe, und ich moechte
> das jede Zeile um 5/10/20/120 Sekunden Verzoegert hinten wieder
> rausfaellt.
perl -e 'while(<STDIN>) { sleep $ARGV[0]; print $_; }'
alternativ
while read a; do sleep 5; echo $a done
Aber ich vermute du willst was schlimmeres - Und war das wenn ich 2
Zeilen reinwerfe dann sollen auch die 2 zeilen in 5 sekunden
rausplumpsen. Das ist schwieriger weil man non-blocking i/o braucht.
Ohne nonblocking i/o wuerde ich das in etwa so machen (ungetestet):
#!/usr/bin/perl -sw
my $delay=5;
my $last=time();
while(<STDIN>) {
$now=time();
push @lines[$now],$_;
for($i=$last;$i<$now-$delay;$i++) {
if (defined($lines[$i])) {
foreach my $line ( @lines[$i] ) {
print $line;
}
delete($lines[$i]);
}
}
}
Problem hier - Sollten keine zeilen mehr kommen wird auch das array fuer
die letzten 5 sekunden nicht durchsucht. Ein weiteres problem koennte
sein das perl nicht so pfiffig ist im memory management wenn ich ein
array nach hinten erweitere und vorne weg loesche. Koennen nen memory
leak geben -> ausprobieren.
Um Problem 1 zu fixen duerfte man kein "while(<STDIN>)" benutzen
sondern stdin auf non-blocking umstellen und erst lesen wenn
daten vorhanden sind (select/sysread).
Flo
--
Florian Lohoff flo at rfc822.org +49-5201-669912
Heisenberg may have been here.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 232 bytes
Desc: not available
URL: <http://lug-owl.de/pipermail/linux/attachments/20020624/a413363f/attachment.sig>
More information about the Linux
mailing list