问题标签 [setrlimit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - printf 使 setrlimit 不起作用
在这个SO question和这个答案之后,似乎在 printf 之后调用 setrlimit 使它不起作用。
这是示例代码:
这是控制台输出:
如果我评论第一个printf
,这里是控制台输出:
有什么理由吗?
[编辑] 我正在运行带有 Xcode 4.6.2 的 MAC OS X 10.7.5。
linux - 匿名 mmap 和数据段大小
我的印象是自从 Unix 系统引入匿名 mmap 以来,RLIMIT_DATA 有点没用,因为 mmap 地址空间不包括在数据段大小中。特别是,glibc malloc() 实现使用匿名 mmap 进行大分配。
然而,我的测试表明,至少在有些非古代 Linux 系统上,匿名 mmap 包含在数据段中。考虑下面的测试程序:
在 RHEL5、6 和 Ubuntu 12.04 上测试。在所有这些上,当使用匿名 mmap() 分配时(使用 glibc malloc() 时 MODE=0 和 MODE=2),数据段大小 (VmData) 会增加以包括分配。
编辑:一些进一步的实验表明,虽然匿名 mmap() 确实增加了 /proc/[PID]/status 中 VmData 字段中报告的数据段大小,但 RLIMIT_DATA 限制仅适用于堆大小,即 brk()分配而不是匿名 mmap()。啊!
现在我的问题是,这种行为在 Linux 上存在多久了,它对其他 Unix 系统的可移植性如何?即,其他 Unix 是否也在数据段大小中包含匿名 mmap?
linux - Apache 2.4 hits rlimit_nproc: hidden processes?
My webapp allows users to execute some arbitrary code in a sandbox. To prevent forkbombs, the application calls setrlimit and limits RLIMIT_NPROC
to 50 before executing user code. This worked great in Ubuntu 12.04 up till Ubuntu 13.04. However, after upgrading to Ubuntu 13.10 (which ships with Apache 2.4 and Linux 3.11), we hit the limit of 50 www-data
processes, even when Apache2 is idle!
The problem is most easily reproduced by running bash
as user www-data
with ulimit
. First switch into user www-data
and start bash
:
Now gradually lower RLIMIT_NPROC
until we hit problems:
Hence after setting RLIMIT_NPROC
to 50, the process can no longer fork. This implies that there are already 50 or more processes running as user www-data
. However, this does not seem to be the case, the server is just a blank idle Apache 2.4. According to ps
, there are currently only 2 procs owned by www-data
:
So why is www-data
is hitting the RLIMIT_NPROC
limit of 50 in Apache 2.4, even when idle?
c - 这是编辑 RLIMIT_NPROC 值的更好方法
我的应用程序创建每个连接线程。应用程序在非零用户 ID 下被破坏,有时线程数超过默认值 1024。我想编辑这个号码,所以我的选择很少
以root身份运行[非常糟糕的主意,还必须与安全性妥协,所以放弃它]
在特权不足的用户下运行,使用setcap并赋予能力CAP_SYS_RESOURCE。然后我可以在我的程序中添加代码
另一件事是编辑/etc/securitylimits.conf ,我可以简单地为开发用户输入并可以输入行,例如
哪里 10k 就足够了。所以我应该继续最后一个选项,所以不愿意更改源代码。而且我更想知道什么是更强大和更标准的方法。
征求你的意见,提前谢谢你:)
PS:如果单个进程的线程数超过 1k,会发生什么情况。我也有 32GB 的 Ram
c++ - setrlimit() 不影响生成的 std::threads
我目前正在研究一次加载和转换多个图像的管道。由于许多图像同时发生这种情况(1440),因此内存占用非常大。因此,我尝试实现基于 setrlimit 的内存管理系统,但是它似乎不会影响生成的线程(std::thread),因为它们会很高兴地忽略限制 - 我知道这是因为在线程函数 - 并最终导致我的程序被杀死。这是我用于设置限制的代码:
我正在使用 Linux。手册页指出 setrlimit 会影响整个过程,所以我有点不知道为什么线程似乎没有受到影响。
编辑:顺便说一下,上面的函数是在 main() 的最开始调用的。
memory - POSIX rlimit:关于 RLIMIT_DATA,我们究竟可以假设什么?
先决条件
POSIX.1 2008 指定了setrlimit()
和getrlimit()
函数。为参数提供了各种常量resource
,其中一些在下面复制以便更容易理解我的问题。
定义了以下资源:
(...)
RLIMIT_DATA
这是进程的数据段的最大大小,以字节为单位。如果超出此限制,malloc() 函数将失败,并且 errno 设置为 [ENOMEM]。
(...)
RLIMIT_STACK
这是初始线程堆栈的最大大小,以字节为单位。该实现不会自动将堆栈增长到超出此限制。如果超过此限制,则应为线程生成 SIGSEGV。如果线程阻塞 SIGSEGV,或者进程忽略或捕获 SIGSEGV 并且没有安排使用备用堆栈,则 SIGSEGV 的处置应在生成之前设置为 SIG_DFL。
RLIMIT_AS
这是进程的总可用内存的最大大小,以字节为单位。如果超出此限制,malloc() 和 mmap() 函数将失败,并且 errno 设置为 [ENOMEM]。此外,自动堆栈增长会因上述影响而失败。
此外,POSIX.1 2008定义的 数据段如下:
3.125 数据段
与进程关联的内存,可以包含动态分配的数据。
我了解该RLMIT_DATA
资源传统上用于表示可以分配给具有该brk()
功能的进程的最大内存量。POSIX.1 的最新版本不再指定此函数,并且许多操作系统(例如 Mac OS X)不支持将此函数作为系统调用。mmap()
相反,它使用不属于 POSIX.1 2008的变体进行模拟。
问题
我对资源的语义和使用有点困惑RLIMIT_DATA
。以下是我的具体问题:
根据此规范,堆栈可以成为数据段的一部分吗?
该标准说
RLIMIT_DATA
:“如果超出此限制,则 malloc() 函数将失败,并且 errno 设置为 [ENOMEM]。” 这是否意味着分配的内存malloc()
必须是数据段的一部分?在 Linux 上,分配的内存
mmap()
不计入数据段。只有分配有brk()
或的内存sbrk()
是数据段的一部分。最新版本的 glibc 使用一种malloc()
实现,它使用mmap()
. 因此, 的值RLIMIT_DATA
不会影响您可以使用 的此实现分配的内存量malloc()
。这是否违反了 POSIX.1 2008?
其他平台是否表现出类似的行为?
该标准说
RLIMIT_AS
:“如果超出此限制,则 malloc() 和 mmap() 函数将失败,并且 errno 设置为 [ENOMEM]。” 由于没有mmap()
为 指定失败RLIMIT_DATA
,我得出结论,从中获得的内存mmap()
不计入数据段。这个假设是真的吗?这是否仅适用于 的非 POSIX 变体
mmap()
?
android - RLIMIT_NPROC 的正确定义是什么?
我正在研究 Android 漏洞利用Rage Against The Cage的实现。它背后的想法是,它会创建尽可能多的进程来RLIMIT_NPROC
获取shell UID,以便下次 Android 调试桥 (ADB) 守护进程尝试将其权限从root删除到shell时,调用setuid()
失败并继续执行以root身份(该错误已通过setuid()
在继续之前检查调用结果来修复)。
根据setrlimit()
文档,RLIMIT_NPROC
定义为:
可以为调用进程的真实用户 ID创建 [强调我的]的最大进程数(或者,更准确地说,在 Linux 上,线程数) 。遇到此限制时,fork(2) 将失败并显示错误 EAGAIN。对于具有 CAP_SYS_ADMIN 或 CAP_SYS_RESOURCE 功能的进程,不会强制执行此限制。
此外,这就是漏洞利用的实现方式:
因此,RLIMIT_NPROC
它被定义为“可以创建的最大进程数”——创建,而不是“同时执行”——并且实现通过终止由第二个分叉创建的每个子进程来秒该定义。
首先,我无法理解如何限制每个 UID 创建的进程数量(我们必须不时重新启动机器以重置该计数,不是吗?)。其次,即使是对漏洞利用进行逆向工程的人,获得了与上面显示的实现等效的实现,也定义了RLIMIT_NPROC
不同的:
它[漏洞利用]利用了 RLIMIT_NPROC max,这是一个定义给定 UID 可以运行多少进程的值。
也就是说,RLIMIT_NPROC 实际是如何工作的?哪个定义更准确?
c - 是否可以在 c 中使用 setrlimit 获得毫秒精度
正如标题所示,我需要知道是否有某种方法可以使setrlimit RLIMIT_CPU的精度低于秒精度?
(我知道在一个典型的系统上,一个程序一次可能需要大约 10 毫秒)我什至不需要它是毫秒精度。100ms 就可以了。
所以我很好奇它会不会是这样的:
我没有看到解释我需要这个的原因以及我如何使用它的相关性。如果需要,我将编辑问题和信息。
提前致谢,
前任
c - 使用 setrlimit 设置线程的堆栈大小
我正在使用一个库,它使用 8MB 的默认堆栈大小创建一个 pthread。是否可以以编程方式减少库创建的线程的堆栈大小?我尝试setrlimit(RLIMIT_STACK...)
在我的main()
函数内部使用,但这似乎没有任何效果。 ulimit -s
似乎可以完成这项工作,但我不想在我的程序执行之前设置堆栈大小。
有什么想法我能做什么?谢谢
更新 1:似乎我要放弃使用setrlimit(RLIMIT_STACK,...).
我检查常驻内存并发现它比虚拟内存少很多来设置堆栈大小的方法。这足以让我放弃尝试限制堆栈大小。