假设,你是一个POSIX系统上,你可以通过调用这个限制setrlimit(2)之后fork().例如:
if (fork() == 0) {
struct rlimit limits;
limits.rlim_cur = 10000000; // set data segment limit to 10MB
limits.rlim_max = 10000000; // make sure the child can't increase it again
setrlimit(RLIMIT_DATA, &limits);
execv(...);
}
Run Code Online (Sandbox Code Playgroud)
如果您的子进程尝试分配比此更多的内存,它将不会自动终止,但它将无法满足内存分配请求.如果儿童计划选择在这种情况下中止,那么它将会死亡.如果选择继续,则不会通知父母这种情况.
阅读这个setrlimit功能.你可能想要这样的东西:
#include <sys/resource.h>
struct rlimit limits;
limits.rlim_cur = // soft limit
limits.rlim_max = // hard limit
int err = setrlimit(RLIMIT_DATA, &limits);
if(err) ...
Run Code Online (Sandbox Code Playgroud)
这假设您正在为Unix/Linux/BSD/Mac /等编写,而不是Windows ...这似乎是一个很好的猜测,因为你正在使用execv.
一些注意事项:软限制(rlim_cur)可能会通知进程超出限制.超过硬限制(rlim_max)会malloc()导致失败,设置errno为ENOMEM,这通常会导致进程死亡.阅读手册页或尝试一下,看看它在您的系统上是如何工作的.如果堆栈增长rlim_max,您可能会收到SIGSEGV信号.
通常,只有根进程才能引发rlim_max.常规过程可以降低rlim_max或设置rlim_cur为0到0之间的任何范围rlim_max.