读取/dev/urandom是否线程安全?

10
这是代码:

  unsigned int number;
  FILE* urandom = fopen("/dev/urandom", "r");
  if (urandom) {
    size_t bytes_read = fread(&number, 1, sizeof(number), urandom);
    DCHECK(bytes_read == sizeof(number));
    fclose(urandom);
  } else {
    NOTREACHED();
  }

如果不安全,我该如何使其线程安全?
1个回答

12
只要每次执行函数时在自己的线程中(即,本地变量 number、urandom、bytes_read 不在不同线程之间共享),我认为不存在任何线程安全问题。然后,每个线程都将拥有自己的文件描述符进入 /dev/urandom。同时,可以从多个进程同时打开 /dev/urandom,所以这是可以的。
顺便说一下, /dev/urandom 可能无法打开,你的代码应该处理它。一些原因包括:可用文件描述符耗尽;/dev 没有正确挂载(虽然在这种情况下你会有更大的问题);你的程序正在特殊的 chroot 中运行,拒绝访问任何设备等。

显然,出于安全考虑,应该是安全的,但我在 man 4 random 中找不到任何指定它是安全的内容。例如,如果 urandom 已经回退到 PRNG 模式,两个同时调用者是否会看到除了偶然之外相同的输出?当然不会,但文档在哪里说呢? - Steve Jessop
“观察到相同的输出”是“随机”的一个特例。 :-) - R.. GitHub STOP HELPING ICE
@SteveJessop:文档不需要说明接口是有效的。另外,urandom只有一种模式。 - David Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接