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