GETRANDOM - Linux手册页

时间:2019-08-20 17:58:50  来源:igfitidea点击:

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。

错误说明

EAGAIN
请求的熵不可用,如果未设置GRND_NONBLOCK标志,getrandom()将被阻止。
EFAULT
buf引用的地址在可访问的地址空间之外。
EINTR
呼叫被信号处理程序中断;请参见signal(7)手册页中有关在有或没有SA_RESTART标志的情况下如何处理"慢速"设备上中断的read(2)调用的说明。
EINVAL
在标志中指定了无效的标志。
ENOSYS
getrandom()的glibc包装函数确定基础内核未实现此系统调用。

版本

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/