2

我收到错误:mlockall failed: 调用函数 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 连接(使用英特尔 i210 以太网控制器)。

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

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

如何解决这个问题?

4

1 回答 1

6

正如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

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

于 2019-03-22T06:56:10.583 回答