我写了一个简单的程序来限制它的数据大小为65Kb并验证相同我分配一个超过65Kb的虚拟内存并且逻辑上如果我正在做所有正确的(如下所示)malloc调用应该失败,不是吗?
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main (int argc, char *argv[])
{
struct rlimit limit;
/* Get max data size . */
if (getrlimit(RLIMIT_DATA, &limit) != 0) {
printf("getrlimit() failed with errno=%d\n", errno);
return 1;
}
printf("The soft limit is %lu\n", limit.rlim_cur);
printf("The hard limit is %lu\n", limit.rlim_max);
limit.rlim_cur = 65 * 1024;
limit.rlim_max = 65 * 1024;
if (setrlimit(RLIMIT_DATA, &limit) != 0) {
printf("setrlimit() failed with errno=%d\n", errno);
return 1;
}
if (getrlimit(RLIMIT_DATA, &limit) != 0) {
printf("getrlimit() failed with errno=%d\n", errno);
return 1;
}
printf("The soft limit is %lu\n", limit.rlim_cur);
printf("The hard limit is %lu\n", limit.rlim_max);
system("bash -c 'ulimit -a'");
int *new2 = NULL;
new2 = malloc(66666666);
if (new2 == NULL)
{
printf("malloc failed\n");
return;
}
else
{
printf("success\n");
}
return 0;
}
令人惊讶的是,输出就是这样 -
The soft limit is 4294967295
The hard limit is 4294967295
The soft limit is 66560
The hard limit is 66560
core file size (blocks, -c) 0
data seg size (kbytes, -d) 65
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14895
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14895
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
success
我做错了吗? 请放弃您的输入。 谢谢!
答案 0 :(得分:5)
RLIMIT_DATA
进程数据段的最大大小(已初始化 数据,未初始化的数据和堆)。此限制会影响通话 到brk(2)和sbrk(2),它们因错误ENOMEM而失败 遇到此资源的软限制。
具体而言,该资源不适用于通过mmap
获得的内存。内部malloc
使用各种机制来获取新内存。在这种情况下,您会发现它使用的是mmap
而不是sbrk
或brk
。您可以通过使用strace
转储程序中的系统调用来验证这一点。
要实现您想要的目标,请使用RLIMIT_AS
资源。
答案 1 :(得分:1)
纠正编码后的问题。
这是代码:
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main ( void )
{
struct rlimit limit;
/* Get max data size . */
if (getrlimit(RLIMIT_DATA, &limit) != 0) {
printf("getrlimit() failed with errno=%d\n", errno);
exit( EXIT_FAILURE );
}
printf("The soft limit is %lu\n", limit.rlim_cur);
printf("The hard limit is %lu\n", limit.rlim_max);
limit.rlim_cur = 65 * 1024;
limit.rlim_max = 65 * 1024;
if (setrlimit(RLIMIT_DATA, &limit) != 0)
{
printf("setrlimit() failed with errno=%d\n", errno);
exit( EXIT_FAILURE );
}
if (getrlimit(RLIMIT_DATA, &limit) != 0)
{
printf("getrlimit() failed with errno=%d\n", errno);
exit( EXIT_FAILURE );
}
printf("The soft limit is %lu\n", limit.rlim_cur);
printf("The hard limit is %lu\n", limit.rlim_max);
system("bash -c 'ulimit -a'");
int *new2 = NULL;
new2 = malloc(66666666);
if (new2 == NULL)
{
printf("malloc failed\n");
exit( EXIT_FAILURE );
}
else
{
printf("success\n");
}
return 0;
}
这是输出:
The soft limit is 18446744073709551615
The hard limit is 18446744073709551615
The soft limit is 66560
The hard limit is 66560
bash: xmalloc: .././variables.c:2307: cannot allocate 48 bytes (16384 bytes allocated)
success
表示对rlimit的修改有效,system
调用成功,bash
命令失败,malloc
成功。
同一代码的多次运行始终输出完全相同的值,因此不会对rlimit值进行永久性更改
在多次运行上述代码后,在打开每个终端窗口的同时,在另一个终端窗口中运行bash
命令导致以下内容:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 54511
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 54511
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
然后在另一个终端中运行代码,然后在同一终端中运行bash
命令输出完全相同的输出值。
因此,我怀疑代码采用了错误的方法来限制可用内存量。