mlockall():无法分配内存

时间:2017-10-27 15:25:26

标签: ubuntu preempt-rt

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

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

使用的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”找不到源文件。 找到文件或编辑源查找路径以包含其位置。

如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

man 2 mlockall所述,您似乎没有权限锁定尝试锁定的内存量。您可以调整该限制,也可以尝试以root用户身份运行程序,例如通过sudo。除了确定限制是否确实是问题之外,我不建议做后者,因此,这里介绍了如何调整Kubuntu上bash的限制-它可能会在您的发行版上有所不同。

首先,让我们看看您的限制是什么

$ ulimit -a | grep locked
max locked memory       (kbytes, -l) 64

64 KB并不多!为此也有一个简写:

$ ulimit -l
64

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

$ ulimit -l 1000000
bash: ulimit: max locked memory: cannot modify limit: Operation not permitted

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

/etc/security/limits.conf来营救!该文件是在启动用户会话时从中读取限制的默认值的文件-请参见man 5 limits.conf

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

nobss - memlock 1000000

将文件的硬限制和软限制都设置为1000000 KB。注销并登录,然后注册:

$ $ ulimit -l
1000000

那更好。除非您的程序使用内存堆,否则此限制应该可以实现-实际上,在大多数情况下,这已经足够了。