El límite se establece de inmediato, pero solo se comprueba cuando se intenta asignar una nueva pila o intentar aumentar la pila existente. Un grep para RLIMIT_STACK (or a LXR identifier search) en las fuentes del kernel debería indicarlo.
Al parecer, el tamaño inicial de la pila es lo que se necesita para las cadenas de nombre de archivo + env + Cuerdas arg más algunas páginas adicionales asignados en setup_arg_pages
(20 páginas en 2.6.33 1, 2, 128 Kb en 2.6.34 3)
En resumen:
initial stack size = MIN(size for filename + arg strings + env strings + extra pages, MAX(size for filename + arg strings + env strings, RLIMIT_STACK))
donde
size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages), RLIMIT_STACK/4)
Además, los núcleos con exec-shield
parche de Ingo Molnar (Fedora, Ubuntu, ...) tienen un EXEC_STACK_BIAS adicional "(2 MB más para cubrir efectos de aleatorización). ", consulte la llamada a la nueva función over_stack_limit()
de acct_stack_growth()
([Ubuntu1], [Ubuntu2], [Ubuntu3]).
He editado el programa original para mostrar esto:
#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);
}
que se traduce en:
$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$
Gracias, ahora soy adicto a averiguar por qué esto no funciona como se anuncia en el hombre (2) setrlimit. Afortunadamente, gcc le permite especificar el tamaño de la pila :) –
Una pregunta preferida más a menudo de lo que fue actualizada, en este momento. Interesante. –