Is there a filter which I could use to rate-limit a pipe on linux? If this exists, let call it rate-limit, I want to be able to type in a terminal something like

cat /dev/urandom | rate-limit 3 -k | foo

in order to send a a stream of random bytes to foo's standard input at a rate (lower than) 3 kbytes/s.

link|improve this question
1  
I asked here because I want to use it in a programme, not for troubleshooting. But it's my very first question here so I apologize if I made an error. – Frédéric Grosshans Mar 17 '10 at 17:54
BTW, the above is an unnecessary use of cat, you could do rate-limit 3k < /dev/urandom | foo. – dmckee Mar 17 '10 at 18:15
feedback

migrated from stackoverflow.com Jan 31 '11 at 10:51

This question came from our site for professional and enthusiast programmers.

2 Answers

up vote 13 down vote accepted

Pipe Viewer has this feature.

cat /dev/urandom | pv -L 3k | foo
link|improve this answer
Thanks for your answer ! – Frédéric Grosshans Mar 17 '10 at 17:59
feedback

I'd say that Juliano has got the right answer if you have that tool, but I'd also suggest that this is a neat little K&R style exercise: just write a specialized version of cat that reads one character at a time from stdin, outputs each to stdout and then usleeps before moving on. Be sure to unbuffer the standard output, or this will run rather jerkily.

I called this slowcat.c:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char**argv){
  int c;
  useconds_t stime=10000; // defaults to 100 Hz

  if (argc>1) { // Argument is interperted as Hz
    stime=1000000/atoi(argv[1]);
  }

  setvbuf(stdout,NULL,_IONBF,0);

  while ((c=fgetc(stdin)) != EOF){
    fputc(c,stdout);
    usleep(stime);
  }

  return 0;
}

Compile it and try with

$ ./slowcat 10 < slowcat.c
link|improve this answer
5  
Now I'm feeling the horrible temptation to add a "clack" noise to each character an set the default speed to 40 CPS, with an extra delay for newlines. – dmckee Mar 17 '10 at 19:19
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.