- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我写了一个简单的程序来将它的数据大小限制为 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
我有没有做错什么?请放下您的输入。谢谢!
最佳答案
RLIMIT_DATA
The maximum size of the process's data segment (initialized data, uninitialized data, and heap). This limit affects calls to brk(2) and sbrk(2), which fail with the error ENOMEM upon encountering the soft limit of this resource.
具体来说,该资源不适用于通过 mmap
获取的内存。 malloc
在内部使用各种机制来获取新内存。在这种情况下,您会发现它使用了 mmap
而不是 sbrk
或 brk
。您可以使用 strace
从您的程序中转储系统调用来验证这一点。
要实现您想要的效果,请改用 RLIMIT_AS
资源。
关于c - 进程资源不受 setrlimit 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488350/
我正在尝试使用 setrlimit()限制流程花费的时间。但是,当我执行某些操作(如 printf())时,它似乎不起作用。 这是一个说明问题的测试程序: #include #include in
我的计算机接受每个进程 380 个线程。我尝试使用 settlimit () 增加到更大的数字,但我得到了预期的结果。 如何增加进程数? 以下代码不能正常工作: #include #
我正在尝试模拟 Linux 中进程的错误场景,即堆不足以在 C++ Linux 应用程序中分配内存。但是即使我使用“setrlimit”来减少进程可用的堆内存,堆内存仍然被成功分配。 struct r
我想限制 execv 生成的程序可以使用一定数量的内存和一定数量的 CPU 时间。例如,我想设置限制,比如程序不能超过 100MB 30 秒,程序不能使用 90% 或更多的 CPU 超过 20 秒。
我正在使用一个库,该库使用默认的 8MB 堆栈大小创建 pthread。是否有可能以编程方式减少库创建的线程的堆栈大小?我尝试在我的 main() 函数中使用 setrlimit(RLIMIT_STA
我写了一个简单的程序来将它的数据大小限制为 65Kb 并验证我正在分配一个超过 65Kb 的虚拟内存并且逻辑上如果我做的都是正确的(如下所示)malloc 调用应该失败,不是吗是吗? #include
关注此SO question和 this answer特别是,似乎在 printf 之后调用 setrlimit 使其无法正常工作。 示例代码如下: #include #include int m
我目前正在研究一次加载和转换多个图像的管道。由于这会同时发生在许 multimap 像上 (1440),因此内存占用量非常大。因此,我尝试实现基于 setrlimit 的内存管理系统,但它似乎不会影响
在下面给出的示例中,我尝试将堆栈大小设置为 1kb。 为什么现在可以在 foo() 中分配大小为 8kb 的整数数组? #include #include void foo(void); int
阅读有关如何为使用 gnu 编译的 c++ 应用程序增加堆栈大小的信息,在编译时,我了解到可以在程序开头使用 setrlimit 来完成。尽管如此,我找不到任何关于如何使用它以及在程序的哪一部分应用它
我可能遗漏了一些东西,也可能没有,但是 setrlimit 函数在 valgrind 下运行时一直失败 int main() { const struct rlimit file_li
我在 Ubuntu 中编写了一个 C++ 程序。在 main 函数中,我有这样的二维数组: int main() { unsigned long long int s[11000][100];
我在为各种程序编写音频插件的公司工作,目前我在 Os X Mavericks 和 Yosemite 上遇到以下逻辑问题。Logic 会扫描我们所有的插件,并且在某些时候它无法再访问这些文件。 errn
我编写了以下 C 程序来限制该程序可以创建的最大进程数(在 Linux 上)。该程序使用了setrlimit(),预计该程序最多可以创建4个进程。 // nproc.c #include #incl
以下男女同校给我一个 EINVAL 错误和 Node 崩溃: var posix = require('posix'); console.log(posix.getrlimit('nofile'));
我注意到在/etc/security/limits.conf 中,限制是基于每个用户(或每个组)配置的,例如: @faculty hard nproc 50 我假设是 setrlimit 完成设置限制
在 Linux(例如 Ubuntu 18.04 或其他)中,getrlimit() 和 setrlimit() 通过读取和写入 /etc/security/来工作限制.conf? 我试图了解 getr
我正在尝试使用 setrlimit 来限制我在 Linux 系统上的内存使用,以阻止我的进程使机器崩溃(我的代码使高性能集群上的节点崩溃,因为一个错误导致内存消耗超过 100 GiB)。我似乎找不到要
我是一名优秀的程序员,十分优秀!