Предел устанавливается сразу же, но проверяется только при попытке выделить новый стек или пытается увеличить существующий стек. Должен сказать grep для RLIMIT_STACK (or a LXR identifier search) в источниках ядра.
По-видимому, начальный размер стека все, что необходимо, чтобы имя файла + ENV строк + ARG строк плюс некоторые дополнительные страницы, выделенные на setup_arg_pages
(20 страниц в 2.6.33 1, 2, 128 Кб на 2.6.34 3).
В итоге:
initial stack size = MIN(size for filename + arg strings + env strings + extra pages, MAX(size for filename + arg strings + env strings, RLIMIT_STACK))
где
size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages), RLIMIT_STACK/4)
Кроме того, ядра с exec-shield
патч Инго Молнар (в Fedora, Ubuntu, ...) имеют дополнительный EXEC_STACK_BIAS «(2MB больше, чтобы покрыть эффекты рандомизации.) «, см. звонок к новой функции over_stack_limit()
от acct_stack_growth()
([Ubuntu1], , [Ubuntu3]).
Я редактировал оригинальную программу, чтобы показать это:
#include <stdio.h>
#include <sys/resource.h>
void foo(void);
int main(int argc, char *argv[]) {
struct rlimit lim = {1, 1};
if (argc > 1 && argv[1][0] == '-' && argv[1][8]=='l') {
printf("limiting stack size\n");
if (setrlimit(RLIMIT_STACK, &lim) == -1) {
printf("rlimit failed\n");
return 1;
}
}
foo();
return 0;
}
void foo() {
unsigned ints[32768];
printf("foo: %u\n", ints[2047]=42);
}
Какие результаты в:
$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$
Спасибо, я теперь увлекаются выяснить, почему это не работает, как рекламируется в человеке (2) setrlimit. К счастью, gcc позволяет указать размер стека :) –
Вопрос был одобрен чаще, чем он был поднят - на этот раз. Интересно. –