- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
问题已通过升级 C 库解决。
我想使用系统调用 getrandom ( http://man7.org/linux/man-pages/man2/getrandom.2.html )
gcc-5 -std=c11 测试.c
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <linux/random.h>
#include <sys/syscall.h>
int main(void)
{
void *buf = NULL;
size_t l = 5;
unsigned int o = 1;
int r = syscall(SYS_getrandom, buf, l, o);
return 0;
}
或
int main(void)
{
void *buf = NULL;
size_t l = 5;
unsigned int o = 1;
int r = getrandom(buf, l, o);
return 0;
}
无论如何,当我尝试用 gcc-5 编译它时:
test.c: In function ‘main’:
test.c:14:17: warning: implicit declaration of function ‘getrandom’ [-Wimplicit-function-declaration]
int r = getrandom(buf, l, o);
^
/tmp/ccqFdJAJ.o: In function `main':
test.c:(.text+0x36): undefined reference to `getrandom'
collect2: error: ld returned 1 exit status
我正在使用 Ubuntu 14.04,如何使用 getrandom?由于它是一个"new"系统调用,我该如何使用它?
编辑:
uname -r
-> 4.0.3-040003-generic #201505131441 SMP Wed May 13 13:43:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
当我将 r 替换为 int r = syscall(SYS_getrandom, buf, l, o);
或者 r = getrandom(buf, l, o) 是一样的..
最佳答案
getrandom
and getentropy
were added to glibc in version 2.25 .截至 2017 年 7 月,大多数 Linux 发行版尚未更新到此版本(例如 Debian 的最新版本,刚刚发布,有 2.24),但他们应该很快。
以下是如何使用可用的 glibc 包装器,如果不可用则回退到原始系统调用:
#define _GNU_SOURCE 1
#include <sys/types.h>
#include <unistd.h>
#if defined __GLIBC__ && defined __linux__
# if __GLIBC__ > 2 || __GLIBC_MINOR__ > 24
# include <sys/random.h>
int
my_getentropy(void *buf, size_t buflen)
{
return getentropy(buf, buflen);
}
# else /* older glibc */
# include <sys/syscall.h>
# include <errno.h>
int
my_getentropy(void *buf, size_t buflen)
{
if (buflen > 256) {
errno = EIO;
return -1;
}
return syscall(SYS_getrandom, buf, buflen, 0);
}
# endif
#else /* not linux or not glibc */
#error "Need implementation for whatever operating system this is"
#endif
(正如其他答案中所指出的,还需要确保您拥有 3.17 或更高版本的内核。以上两个版本的 my_getentropy
都会失败并将 errno
设置为ENOSYS
如果在较旧的内核上运行。)
关于c - 找不到 C 中的 getrandom 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30800331/
这是一道面试题:使用get、put 和getRandom 实现一个Set 类。 我会考虑以下选项: 排序/未排序链表:get - O(N),put - O(N),getRandom - O(N) 未排
这个问题在这里已经有了答案: getrandom syscall in C not found (5 个答案) 关闭 5 年前。 愚蠢的问题,我可能缺少标题,但手册页说我只需要 #include
我有一个 getRandom 方法,它从数组中获取一个随机整数并返回它,但是不知何故,当我尝试在我的驱动程序中调用该方法时,出现错误 “europeanroulette 类型中的方法 getRando
我有如下一段代码 #include #include #include unsigned long int s; syscall(SYS_getrandom, &s, sizeof(unsign
问题已通过升级 C 库解决。 我想使用系统调用 getrandom ( http://man7.org/linux/man-pages/man2/getrandom.2.html ) gcc-5 -s
我构建了一个 scrapy 蜘蛛(scrapy 1.4)。这个蜘蛛是通过 django-rq 和 supervisord 从 django 网站按需触发的。 这是监听 django-rq 事件的 su
请引用os和secrets的文档: os.getrandom(大小,标志= 0) Get up to size random bytes. The function can return less b
我正在尝试在 GCE Ubuntu 14.04 VM 上构建 Python 3.5.1,当在解压缩的文件夹中运行 ./configure 时,我得到: checking for the Linux g
使用 python 安装最新的 alpine ( 3.8 ) 后,出现以下错误 $ docker run -it alpine:3.8 sh / # sed -i -e 's/v[[:digit:]]
我是一名优秀的程序员,十分优秀!