我覺得setrlimit
移動「資源的指針」,但不適用的新限制,直到你exec
程序的新副本。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>
void foo(int chk) {
unsigned ints[2048];
ints[2047] = 42;
printf("foo %d: %u\n", chk, ints[2047]);
}
int main(int argc, char **argv) {
char *newarg[] = { "argv[0]", "one", "two" };
char *newenv[] = { NULL };
struct rlimit lim;
newarg[0] = argv[0];
getrlimit(RLIMIT_STACK, &lim);
printf("lim: %d/%d\n", (int)lim.rlim_cur, (int)lim.rlim_max);
switch (argc) {
case 1: /* first call from command line */
lim.rlim_cur = 65536;
lim.rlim_max = 65536;
if (setrlimit(RLIMIT_STACK, &lim) == -1) return EXIT_FAILURE;
newarg[2] = NULL;
foo(1);
execve(argv[0], newarg, newenv);
break;
case 2: /* second call */
lim.rlim_cur = 1024;
lim.rlim_max = 1024;
if (setrlimit(RLIMIT_STACK, &lim) == -1) return EXIT_FAILURE;
foo(2);
execve(argv[0], newarg, newenv);
break;
default: /* third call */
foo(3);
break;
}
return 0;
}
和測試運行:
$ ./a.out
lim: 8388608/-1
foo 1: 42
lim: 65536/65536
foo 2: 42
Killed
爲什麼進程得到打印的限制(和調用foo之前)殺害前,我不知道。
來源
2010-11-07 15:11:14
pmg
謝謝你,現在我沉迷於找出爲什麼像廣告這不起作用在男人(2)setrlimit。幸運的是,gcc可以讓你指定堆棧的大小:) – 2010-11-07 16:26:49
這個時候,比起upvoted更頻繁的問題。有趣。 – 2010-11-07 17:39:02