GETRANDOM - Linux手册页
Linux程序员手册 第2部分
更新日期: 2017-09-15
名称
getrandom-获取一系列随机字节
语法
#包括
ssize_t getrandom(void * buf,size_t buflen,unsigned int标志);
说明
系统调用getrandom()最多将buflen个随机字节填充到buf指向的缓冲区中。这些字节可用于为用户空间随机数生成器提供种子或用于加密目的。
默认情况下,getrandom()从urandom源(即与/ dev / urandom设备相同的源)提取熵。可以通过flags参数更改此行为。
如果urandom源已初始化,则最多256个字节的读取将始终返回所需的字节数,并且不会被信号中断。没有这样的保证适用于更大的缓冲区大小。例如,如果调用被信号处理程序中断,则它可能返回部分填充的缓冲区,或者失败并显示错误EINTR。
如果urandom源尚未初始化,则除非在标志中指定GRND_NONBLOCK,否则getrandom()将阻塞。
flags参数是一个位掩码,可以包含零个或多个以下值或在一起运算:
- GRND_RANDOM
- 如果设置了此位,那么将从随机源(即与/ dev / random设备相同的源)而不是urandom源中提取随机字节。基于可以从环境噪声获得的熵来限制随机源。如果随机源中的可用字节数少于buflen中的请求,则调用仅返回可用的随机字节。如果没有可用的随机字节,则行为取决于flags参数中GRND_NONBLOCK的存在。
- GRND_NONBLOCK
- 默认情况下,从随机源读取时,如果没有可用的随机字节,则getrandom()会阻塞;从urandom源读取时,如果尚未初始化熵池,则会阻塞。如果设置了GRND_NONBLOCK标志,则在这些情况下getrandom()不会阻塞,而是将errno设置为EAGAIN的情况下立即返回-1。
返回值
成功后,getrandom()返回复制到缓冲区buf的字节数。如果在标志中指定了GRND_RANDOM,并且随机源中没有足够的熵,或者系统调用被信号中断,则该数目可能小于通过buflen请求的字节数。
如果出错,则返回-1,并正确设置errno。
错误说明
版本
getrandom()在Linux内核的3.17版中引入。支持已添加到glibc 2.25版中。
遵循规范
此系统调用是特定于Linux的。
备注
有关可用于获得随机性的各种接口的概述和比较,请参见random(7)。
与/ dev / random和/ dev / urandom不同,getrandom()不涉及路径名或文件描述符的使用。因此,在chroot(2)使/ dev路径名不可见并且应用程序(例如,启动过程中的守护程序)关闭由库打开的这些文件之一的文件描述符的情况下,getrandom()可能会很有用。 。
Maximum number of bytes returned
从Linux 3.19开始,以下限制适用:
- *
- 从urandom源读取时,在int大小为32位的系统上,对getrandom()的单次调用最多返回33554431字节。
- *
- 从随机源读取时,最多返回512个字节。
Interruption by a signal handler
从urandom源读取(未设置GRND_RANDOM)时,getrandom()将阻塞,直到熵池已初始化(除非指定了GRND_NONBLOCK标志)。如果请求读取大量字节(超过256个),则getrandom()将阻塞,直到生成了这些字节并将其从内核内存传输到buf。从随机源读取时(设置了GRND_RANDOM),getrandom()将阻塞,直到一些随机字节变为可用为止(除非指定了GRND_NONBLOCK标志)。
当从urandom源读取时阻塞对getrandom()的调用而被信号处理程序中断时,其行为取决于熵缓冲区的初始化状态以及请求大小buflen。如果熵尚未初始化,则调用失败,并显示EINTR错误。如果熵池已初始化并且请求大小很大(buflen> 256),则调用将成功,返回部分填充的缓冲区或失败,并显示错误EINTR。如果熵池已初始化且请求大小较小(buflen
从随机源读取数据时,任何大小的阻塞请求都可以被信号处理程序中断(调用失败,错误为EINTR)。
使用getrandom()读取小缓冲区(
小值buflen的特殊处理旨在与OpenBSD的getentropy(3)兼容,glibc现在支持该getentropy(3)。
getrandom()的用户必须始终检查返回值,以确定是否发生错误或返回的字节数少于请求的字节数。在未指定GRND_RANDOM且buflen小于或等于256的情况下,永远不会发生比请求的字节数少的返回,但是无论如何,谨慎的程序员都会进行检查!
BUGS
从Linux 3.19开始,存在以下错误:
- *
- 根据CPU的负载,getrandom()在读取所有请求的字节之前不会对中断做出反应。
另外参见
getentropy(3),random(4),urandom(4),random(7),signal(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。