In a process using lots of memory, how can I spawn a shell without a memory-hungry fork()?
Some UNIX implementations will give you a vfork
(part of the Single UNIX spec) which is exactly like fork
except that it shares all the stuff with the parent.
With vfork
, there are a very limited number of things you can do in the child before calling exec
to overwrite the address space with another process - that's basically what vfork
was built for, a minimal copy version of fork
for the fork/exec
sequence.
If your system has an MMU, then usually fork()
is implemented using copy-on-write, which doesn't actually allocate more memory at the time fork()
is called. Additional memory would only be allocated if you write to any of the pages shared with the parent process. An exec()
would then discard those pages.
If you know you don't have an MMU, then perhaps fork()
is indeed implemented using an actual copy. Another approach might be to have a helper process that is responsible for spawning subshells, which you communicate with using a pipe.