3

有没有办法控制 /dev/urandom 的速度

例如,我有这样的二进制序列生成器:

grep -ao "[01]" /dev/urandom|tr -d \\n

我需要让它更慢,每秒 100 个符号,每秒 1000 个符号。

4

3 回答 3

2

您可以使用pv(除其他外)限制来自管道的数据:

grep -ao "[01]" /dev/urandom | tr -d \\n | pv -q -L 100

在这里,我-L在“限制”中使用 as 来获得每秒最多 100 字节的输出速率。在-q那里可以抑制来自pv. 对于每秒 1000 字节,您可以使用-L 1000or-L 1k代替。

于 2016-02-20T14:41:50.073 回答
1

如果你有 perl,例如可以制作一个小脚本,例如cps.pl

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes qw(usleep);
local $|=1;
while(<>) {
    chomp;
    print $_;
    usleep(100000);
}

并运行:

grep -ao "[01]" /dev/urandom | perl cps.pl

玩睡眠时间以获得正确的速度。也许也想用 perl 实现 grep 部分。

#!/usr/bin/perl

use strict;
use warnings;
use Time::HiRes qw( usleep);

open my $rfd, "<:raw", "/dev/urandom" or die "$!";
my $buff;
local $|=1;
while() {
        read ($rfd, $buff, 1);
        next unless $buff =~ /[01]/;
        usleep(10000);
        print $buff;
}
close $rfd;

并简单地运行perl cps.pl

补充: 如果您不需要加密安全的随机数,您可以使用下一个单行:

perl -MTime::HiRes -e '$|=1;while(1){print int(rand(2)); Time::HiRes::usleep(10000)}'
于 2013-05-03T08:25:11.017 回答
-1

这可能会因处理器而异,但尝试起来很有趣

#!/bin/bash    
microsleep ()
{
  for (( y=0; y<$1*50; y++ ))
  do
    :
  done
}

tr -cd 01 </dev/urandom | while read -n1 b
do
  printf $b
  microsleep 1
done

结果

$ timeout 1 microsleep.sh > log

$ stat -c%s log
1011
于 2013-05-03T08:26:41.367 回答