Das Limit wird sofort gesetzt, aber nur überprüft, wenn versucht wird, einen neuen Stack zuzuweisen oder den bestehenden Stack zu vergrößern. Ein grep für RLIMIT_STACK (or a LXR identifier search) über die Kernel-Quellen sollte sagen.
Offenbar ist die anfängliche Größe des Stapels ist, was zu den Dateinamen + env Strings + arg Strings plus einige zusätzliche Seiten auf setup_arg_pages
(20 Seiten in 2.6.33 1, zugeordnet benötigt wird 2, 128 Kb auf 2.6.34 3).
Zusammengefasst:
initial stack size = MIN(size for filename + arg strings + env strings + extra pages, MAX(size for filename + arg strings + env strings, RLIMIT_STACK))
wo
size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages), RLIMIT_STACK/4)
Zusätzlich Kerne mit Ingo Molnar exec-shield
Patch (Fedora, Ubuntu, ...) haben eine zusätzliche EXEC_STACK_BIAS „(2MB mehr zur Deckung Randomisierungseffekte.) ", siehe Aufruf der neuen Funktion over_stack_limit()
von acct_stack_growth()
([Ubuntu1], [Ubuntu2], [Ubuntu3]).
Ich habe das ursprüngliche Programm bearbeitet, dies zu zeigen:
#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);
}
was zur Folge hat:
$./rl
foo: 42
$./rl -l
limiting stack size
Segmentation fault
$
Vielen Dank, ich jetzt um herauszufinden, süchtig bin, warum dies nicht funktioniert, wie in der Werbung im Menschen (2) setrlimit. Glücklicherweise können Sie in gcc die Stackgröße angeben :) –
Eine Frage, die häufiger favorisiert wurde, als sie aktualisiert wurde - zu diesem Zeitpunkt. Interessant. –