从Linux内核中获取真随机数
[38070.575481] We get random number: 240443446
[38070.575485] We get random number: -606998911
[38070.575489] We get random number: 538794850
[38070.575493] We get random number: -500786675
[38070.575497] We get random number: -1240394927
[38070.575501] We get random number: 1233931345
[38070.575504] We get random number: 1488497117
[38070.575508] We get random number: -177688514
/dev/random /dev/urandom
这两个特殊设备都是字符型设备。我们可以在用户空间通过read系统调用读这两个设备文件以此获取随机数。这两个设备文件的区别在于:如果内核熵池的估计值为0时,
/dev/random将被阻塞,而/dev/urandom不会有这个限制。
#include
#include
#include
#include
#include
/* 从min和max中返回一个随机值 */
int random_number(int min, int max)
{
static int dev_random_fd = -1;
char *next_random_byte;
int bytes_to_read;
unsigned random_value;
assert(max > min);
if (dev_random_fd == -1)
{
dev_random_fd = open(/dev/random, O_RDONLY);
assert(dev_random_fd != -1);
}
next_random_byte = (char *)random_value;
bytes_to_read = sizeof(random_value);
/* 因为是从/dev/random中读取,read可能会被阻塞,一次读取可能只能得到一个字节,
* 循环是为了让我们读取足够的字节数来填充random_value.
*/
do
{
int bytes_read;
bytes_read = read(dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
}while(bytes_to_read > 0);
return min + (random_value % (max - min + 1));
}
同样,还可以用dd命令从/dev/urandom中获取指定字节数的随机值并写入文件中保存--如果你需要以文件的形式提供随机数的话。
dd if=/dev/urandom of = file count = 1 bs = bytes
评论