RANDOM_R - Linux手册页
Linux程序员手册 第3部分
更新日期: 2017-09-15
名称
random_r,srandom_r,initstate_r,setstate_r-可重入随机数生成器
语法
#include <stdlib.h> int random_r(struct random_data *buf, int32_t *result); int srandom_r(unsigned int seed, struct random_data *buf); int initstate_r(unsigned int seed, char *statebuf, size_t statelen, struct random_data *buf); int setstate_r(char *statebuf, struct random_data *buf);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
random_r(),srandom_r(),initstate_r(),setstate_r():
- / *自2.19开始的Glibc:* / _DEFAULT_SOURCE || / * Glibc版本
说明
这些函数是random(3)中描述的函数的可重入等效项。它们适用于多线程程序,其中每个线程都需要获得独立的,可再现的随机数序列。
random_r()函数类似于random(3),不同之处在于它不是在全局变量中维护状态信息,而是在buf指向的参数中使用状态信息,该参数必须事先由initstate_r()初始化。生成的随机数将在参数结果中返回。
srandom_r()函数类似于srandom(3),不同之处在于它为随机数生成器初始化种子,该种子的状态保持在buf指向的对象中,该对象必须事先由initstate_r()初始化,而不是种子与全局状态变量关联。
initstate_r()函数类似于initstate(3),不同之处在于它会初始化buf指向的对象中的状态,而不是初始化全局状态变量。在调用此函数之前,必须将buf.state字段初始化为NULL。 initstate_r()函数在buf指向的结构内记录一个指向statebuf参数的指针。因此,只要buf仍在使用,就不应释放statebuf。 (因此,通常应将statebuf分配为静态变量,或使用malloc(3)或类似方法在堆上分配。)
setstate_r()函数类似于setstate(3),不同之处在于它修改buf指向的对象中的状态,而不是修改全局状态变量。状态必须先使用initstate_r()初始化,或者是先前调用setstate_r()的结果。
返回值
所有这些函数成功均返回0。发生错误时,将返回-1,并设置errno以指示错误原因。
错误说明
- EINVAL
- 小于8个字节的状态数组已指定给initstate_r()。
- EINVAL
- setstate_r()的statebuf或buf参数为NULL。
- EINVAL
- random_r()的buf或result参数为NULL。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
random_r(),srandom_r(), initstate_r(),setstate_r() | Thread safety | MT-Safe race:buf |
遵循规范
这些功能是非标准的glibc扩展。
BUGS
initstate_r()接口令人困惑。看来random_data类型是不透明的,但是该实现要求用户在调用之前将buf.state字段初始化为NULL或将整个结构归零。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。