当前位置: 首页 > 面试题库 >

如何在C中使用/ dev / random或urandom?

东龙野
2023-03-14
问题内容

我想使用/dev/random/dev/urandom在C中使用。我该怎么做?我不知道如何用C处理它们,如果有人知道,请告诉我如何。谢谢。


问题答案:

通常,最好避免打开文件以获取随机数据,因为该过程中存在多个故障点。

在最近的Linux发行版,该getrandom系统调用可用来获取加密安全随机数,它不能失败 ,如果 GRND_RANDOM没有
指定为标志和读取量最多256个字节。

截至2017年10月,OpenBSD,Darwin和Linux(带有-lbsd)现在都已实现了arc4random加密安全并且不会失败。这使其成为一个非常有吸引力的选择:

char myRandomData[50];
arc4random_buf(myRandomData, sizeof myRandomData); // done!

否则,您可以像使用文件一样使用随机设备。您从他们那里读取,并且您得到随机数据。我在这里使用open/ read,但fopen/
fread也可以正常使用。

int randomData = open("/dev/urandom", O_RDONLY);
if (randomData < 0)
{
    // something went wrong
}
else
{
    char myRandomData[50];
    ssize_t result = read(randomData, myRandomData, sizeof myRandomData);
    if (result < 0)
    {
        // something went wrong
    }
}

关闭文件描述符之前,您可能会读取更多随机字节。/ dev /
urandom永远不会阻塞,并且总是按照您的请求填充尽可能多的字节,除非系统调用被信号中断。它被认为是加密安全的,应该是您的首选随机设备。

/ dev /
random更挑剔。在大多数平台上,它可以返回的字节数少于您要求的字节数,并且如果没有足够的字节数,它可以阻塞。这使错误处理的故事变得更加复杂:

int randomData = open("/dev/random", O_RDONLY);
if (randomData < 0)
{
    // something went wrong
}
else
{
    char myRandomData[50];
    size_t randomDataLen = 0;
    while (randomDataLen < sizeof myRandomData)
    {
        ssize_t result = read(randomData, myRandomData + randomDataLen, (sizeof myRandomData) - randomDataLen);
        if (result < 0)
        {
            // something went wrong
        }
        randomDataLen += result;
    }
    close(randomData);
}


 类似资料:
  • 问题内容: 一些背景信息:我想在Red Hat服务器上运行脚本以从/ dev / random中读取一些数据,并使用Perl unpack()命令将其转换为十六进制字符串,以备后用(基准数据库操作)。我在/ dev / random上运行了一些“ head -1”,它看起来工作得很好,但是多次调用后,它还是会挂起。几分钟后,它将最终输出一小段文本,然后结束。 我切换到/ dev / urandom

  • 问题内容: 我需要在Netbeans 7.2的小型本地JavaDB中进行SQL调用,以从数据库中提取单个随机行。 到目前为止,我已经可以使用RANDOM()函数来工作了,但是我无法使LIMIT 1正常工作,它返回了语法错误。 我知道每个数据库都有不同的方法来执行此操作,而且我无法弄清楚它如何专门用于Netbeans中的JavaDB(我知道它可以在具有不同语法的单独Oracle DB中工作)。 是否

  • 当我运行命令< code>rake compile时,我很难弄清楚为什么我的rb_define_singleton和rb_define_method调用会中断。 首先,一个问题可能是我不确定最后一个整数参数实际上代表什么,以便决定使用什么值,我无法找到解释这一点的文档,但我觉得我只是猜测在那里,但问题似乎在第3个参数中,所以我担心的是 其次,我的构建失败,在调用时出现以下错误: 使编译../../

  • 问题内容: 我正在使用具有9个样本和大约7000个属性的随机森林模型。在这些样本中,我的分类器可以识别3个类别。 我知道这远非理想条件,但我正在尝试找出哪些属性在特征预测中最重要。哪些参数最适合优化功能重要性? 我尝试了不同的方法,发现“重要特征”(即数组中的非零值)的数量急剧增加。 我已经阅读了文档,但是如果有任何经验,我想知道最适合调整哪些参数,并简要说明原因。 问题答案: 根据我的经验,sk

  • Dev C++是一个Windows环境下的一个适合于初学者使用的轻量级 C/C++ 集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。它集合了MinGW中的GCC编译器、GDB调试器和AStyle格式整理器等众多自由软件。 Dev C++使用MinGW/GCC编译器,遵循C/C++标准。开发环境包括多页面窗口、工程编辑器以及调试器等,在工程编辑器中集合了编辑器、编译器、连接程

  • 问题内容: 在新的Go语言中,如何调用C 代码?换句话说,如何包装我的C 类并在Go中使用它们? 问题答案: 更新: 我已经成功地将一个小型测试C ++类与Go链接在一起 如果您使用C接口包装C ++代码,则应该可以使用cgo调用您的库(请参阅中的gmp示例)。 我不确定C ++中的类概念是否真的可以在Go中表达,因为它没有继承。 这是一个例子: 我有一个C ++类定义为: 我想在Go中使用。我将