mlockall():无法分配内存

ina*_*arn 3 ubuntu preempt-rt

我收到错误: mlockall 失败:调用函数 mlockall() 时无法分配内存:

if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
            printf("mlockall failed: %m\n");
            exit(-2);
    }
Run Code Online (Sandbox Code Playgroud)

使用的IDE:Eclipse操作系统:Ubuntu 16.04实时扩展使用:4.11.12 rt-15(抢占补丁)注意:我正在尝试实时进行UDP连接(使用intel i210以太网控制器)。

当我在 Eclipse 中调试相同的内容时,显示的是:

在“/build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/syscall-template.S”处找不到源文件找到该文件或编辑源查找路径以包含其位置。

怎么解决这个问题呢?

小智 7

正如man 2 mlockall所解释的那样,您似乎没有权限锁定您尝试锁定的内存量。您可以调整该限制,或者尝试以 root 身份运行您的程序,例如通过sudo. 除了查明限制是否确实是问题所在之外,我不建议执行后者,因此这里介绍了如何在 Kubuntu 上调整 bash 的限制 - 它在您的发行版上可能会有不同的工作方式。

\n

首先,让我们看看你的极限是多少:

\n
$ ulimit -a | grep locked\nmax locked memory       (kbytes, -l) 64\n
Run Code Online (Sandbox Code Playgroud)\n

64 KB 并不算多!为此,有一个简写,\xc2\xa0too:

\n
$ ulimit -l\n64\n
Run Code Online (Sandbox Code Playgroud)\n

您很可能无法轻松调整限制:

\n
$ ulimit -l 1000000\nbash: ulimit: max locked memory: cannot modify limit: Operation not permitted\n
Run Code Online (Sandbox Code Playgroud)\n

即使是这样,它也不会在 shell 调用、重新启动等过程中持续存在。所以我们需要一种不同的方法。

\n

/etc/security/limits.conf来救援!这是用户会话启动时读取限制默认值的文件 - 请参阅man 5 limits.conf

\n

添加以下行(nobss是我的用户名,显然你应该使用你的用户名)

\n
nobss - memlock 1000000\n
Run Code Online (Sandbox Code Playgroud)\n

将该文件的硬限制和软限制设置为 1000000 KB。注销并登录,然后查看\xc3\xa0:

\n
$ ulimit -l\n1000000\n
Run Code Online (Sandbox Code Playgroud)\n

这样更好。除非你的程序使用大量内存,否则这个限制应该可以——事实上,在大多数情况下它已经足够了。

\n