Linuxでパイプをレート制限するために使用できるフィルターはありますか?これが存在する場合は、レート制限と呼びましょう。ターミナルに次のように入力できるようにしたいと思います
cat /dev/urandom | rate-limit 3 -k | foo
ランダムなバイトのストリームをfooの標準入力に3 kbytes/sの速度(以下)で送信するため。
パイプビューア にはこの機能があります。
cat /dev/urandom | pv -L 3k | foo
そのツールがあれば ジュリアーノは正しい答えを得ました と言いますが、これはきちんとした小さなK&Rスタイルの演習であることもお勧めします。 stdin
から一度に1文字ずつ、それぞれをstdout
に出力し、次にusleep
sに出力してから次に進みます。必ず 標準出力のバッファリングを解除するには を使用してください。そうしないと、ぎくしゃくした動作になります。
これを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;
}
コンパイルして試してください
$ ./slowcat 10 < slowcat.c
throttle これのために具体的に設計されているようです。例えば.
cat /dev/urandom | throttle -k 3 | foo
以下は、入力を失わないオールシェルソリューションです(Mike Sのhead -1のアイデアを参照)。
hexdump -c /dev/urandom | (lines=0; while read line; do echo $line; if [ $((++lines % 10)) -eq 0 ]; then sleep 1; fi; done) | cat -n
素早い、汚い、常にすべてのシェル(CentOSがあり、pvにはデフォルトで付属していません):
hexdump -c /dev/urandom | while true; do head -1; sleep 1; done | \
your_program_that_reads_stdin -your_argument_list
...汚いのは、レートが制限されているにもかかわらず、私があなたに伝えることのできないレートでバースト的だからです:-)。しかし、ある場所から別の場所にデータを送信する必要があるだけで(私はいくつかのsocatテストを行っていました)、画面をゴミでいっぱいにしたくない場合に便利です。