/ dev / random不会阻塞

时间:2012-11-02 06:43:07

标签: c linux unix random entropy

我正在尝试从/ dev / random收集真正的随机数。这是我的简单代码:

u_char buf[256];

memset(buf, 0, 256);

int dev = open("/dev/random", O_RDONLY);

int nbr = read(dev, buf, 100);

printf("Number of bytes returned : %d\n", nbr);

你可以看到我要求100个随机字节,但是当我运行这个程序时,我总是得到变量 nbr 的输出,范围是15到30,这可以理解为/ dev / random并不总是有足够的熵,但我的期望是,在read()时,/ dev / random应该阻塞,直到它将我的缓冲区填充到100个随机字节,在这种情况下不会发生并且程序不会阻塞。我读了/ dev / random的手册页。它说

  

当熵池为空时,来自/ dev / random的读取将被阻止   直到收集到额外的环境噪音。

这是否意味着/ dev / random只会在熵池为空时阻塞,并且当它有任何数量的数据时是否会阻塞,无论它是否小于所需的字节数?

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:5)

/dev/random并不特别,这只是read的行为。该参数是缓冲区大小,read将返回该大小可用的内容。

考虑使用FILE*fread来读取一个100字节的块。

答案 1 :(得分:2)

简而言之,除非要读取 没有 数据,否则不会阻止读取。它总会返回它可以读取的数量或错误,即使数据少于您想要的数据。

答案 2 :(得分:1)

您的程序正在从/dev/random读取100个字节。如果你通过一些手动操作重新启动它(例如输入命令,或者只是bash的向上箭头键),那个手动操作(按键序列)正在为random(4)的熵池提供信息。所以你永远不会陷入封锁的情况。

应用于/dev/random的{​​{3}}系统调用的语义是它会尝试读取一些字节。如果至少读取了一个字节,则read(2)系统调用成功并且不会阻塞。

另外,正如我评论的那样,最近足够的硬件和最近足够的内核有足够好的随机源,可能永远不会阻塞。{/ p>

答案 3 :(得分:0)

/ dev / random从SHA1(entropy_pool_data)获取数据。 SHA1仅输出20个字节。如果您希望获得真正的随机位,则从/ dev / random请求超过160位是没有意义的。