This page validates as XHTML 1.0, and will look much better in a browser that supports web standards, but it is accessible to any browser or Internet device. It was created using techniques detailed at glish.com/css/.
Several folks have asked when should a program set the stack size rlimit.. just before exec() is the only sensible point.
Once your process has started up things have been mapped just below the reserved stack space, the size of which is the value of the stack space resource limit at the time the program assembled its address space ( ie during exec).
lets use pmpa and have a look..
ulimit -S -s 20000
ulimit -S -s
20000
sleep 20 & pmap $!
2460: sleep 20
00010000 8K r-x-- /usr/bin/sleep
00022000 8K rwx-- /usr/bin/sleep
00024000 8K rwx-- [ heap ]
FE700000 864K r-x-- /lib/libc.so.1
FE7E8000 32K rwx-- /lib/libc.so.1
FE7F0000 8K rwx-- /lib/libc.so.1
FE810000 8K r-x-- /platform/sun4u-us3/lib/libc_psr.so.1
FE820000 24K rwx-- [ anon ]
FE830000 184K r-x-- /lib/ld.so.1
FE86E000 8K rwx-- /lib/ld.so.1
FE870000 8K rwx-- /lib/ld.so.1
FFBFE000 8K rw--- [ stack ]
total 1168K
mdb
> (FFBFE000-FE870000)%0t1024=D
20024
>
so the first shared library ld.so.1 has been mapped below the reserved swap space.
ulimit -S -s 200000
ulimit -S -s
200000
sleep 20 & pmap $!
[1] 2463
2463: sleep 20
00010000 8K r-x-- /usr/bin/sleep
00022000 8K rwx-- /usr/bin/sleep
00024000 8K rwx-- [ heap ]
F3700000 864K r-x-- /lib/libc.so.1
F37E8000 32K rwx-- /lib/libc.so.1
F37F0000 8K rwx-- /lib/libc.so.1
F3840000 8K r-x-- /platform/sun4u-us3/lib/libc_psr.so.1
F3850000 24K rwx-- [ anon ]
F3860000 184K r-x-- /lib/ld.so.1
F389E000 8K rwx-- /lib/ld.so.1
F38A0000 8K rwx-- /lib/ld.so.1
FFBFE000 8K rw--- [ stack ]
total 1168K
mdb
> (FFBFE000-F38A0000)%0t1024=D
200056
>
So if I use setrlimit to change the current stack space setting to a bigger number then all future mappings will be pushed down below that reserved space but existing mappings won't move, and if your stack tries to grow over them you will get a segv signal. So you should only ever increase the stack size rlimit just before a call to exec().
This stack size will only affect the default stack for the main thread in a process, the stack for other threads are sized at thread_create() time either using the default 1MB or a program specified amount.