Witam. Gdy kompilujemy program, powiedzmy w c, kto decyduje jakiej wielkosci jest stos, jakie zmienne sa tam odkladane a jakie nie, itd? Czy mozna jakos na to wplywac (np. powiedziec ze chce stos nia 10kb a 100?).
Zdaje się, że system operacyjny.
Linux:
endrju@kormoran ~ $ ulimit -a | grep stack
stack size (kbytes, -s) 8192
Żeby zmienić należy użyć opcji -s
oraz liczby, która ma być nowym rozmiarem stosu w KiB.
Edit: to jest tylko miękki limit, patrz mój post niżej.
ulimit pokazuje limity ustalone przez system operacyjny. Wielkosci stosu i alokacja sa wkompilowane w program, ktory mogl byc tworzony na innym systemie z innymi ustawieniami. Wydaje mi sie ze nie masz tutaj racji, ale chetnie poczekam na inne opinie.
No ok, linker może to zmienić (na niektórych systemach), program sam może sobie ustawić. Ale to system operacyjny wymusza górny limit, którego zwykły program nie może przekroczyć.
Jeżeli chodzi o Linuksa zobacz:
http://linux.die.net/man/5/limits.conf
http://linux.die.net/man/2/setrlimit
Oraz manual ld
parametr --stack
.
Edit:
Otóż to co napisałem w pierwszym poście nie jest do końca prawdą, ulimits
podaje domyślnie miękki limit. Okazuje się, że domyślnym twardym limitem jest u mnie nieskończoność. Szybka zmiana w /etc/security/limits.conf
pozwoliła zmienić twardy limit. Jest on wypisywany jeżeli użyje się ulimits -Ha
lub od razu ulimits -Hs
. Nie da się rozszerzyć rozmiaru stosu poza twardy limit a miękki jest używany jako domyślny.