Sınır hemen belirlenir, ancak yalnızca yeni bir yığın ayırmaya veya varolan yığını büyütmeye çalışırken denetlenir. Çekirdek kaynakları üzerinde RLIMIT_STACK (or a LXR identifier search) için bir grep söylemelidir.
Görünüşe göre, yığının başlangıç boyutu 2.6.34 3 üzerinde 2.6.33 1, 2, 128 Kb olarak dosya adı + env dizeleri + arg dizeleri artı setup_arg_pages
(20 sayfalarında tahsis bazı ekstra sayfalar için gereken her türlü olduğu).
size for filename + arg strings + env strings <= MAX(ARG_MAX(32 pages), RLIMIT_STACK/4)
Ayrıca, Ingo Molnar en exec-shield
yama (Fedora, Ubuntu, ...) ile çekirdekleri ilave EXEC_STACK_BIAS sahip
initial stack size = MIN(size for filename + arg strings + env strings + extra pages, MAX(size for filename + arg strings + env strings, RLIMIT_STACK))
"(2MB daha kapsayacak şekilde: Özetle
rasgele efektler.) ", ([Ubuntu1], [Ubuntu2], [Ubuntu3]) over_stack_limit()
işlevine yapılan çağrıya bakın. sonuçlanan
#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
$
şimdi reklamı olarak bu işe yaramazsa neden bulmaya bağımlıyım, teşekkür ederiz
Bunu göstermek için orijinal programı kaydetmiştiniz adam (2) setrlimit. Neyse ki, gcc yığın boyutunu belirtebilmenizi sağlar :) –
Bu kez daha fazla desteklendiğinden daha sık bir soru. İlginç. –