> I thought it does share the segments. And I think I saw this behaviour on
> Linux and some BSDs.
Linux:
NAME
fork - create a child process
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
DESCRIPTION
fork creates a child process that differs from the parent
process only in its PID and PPID, and in the fact that
resource utilizations are set to 0. File locks and pendÂ
ing signals are not inherited.
Under Linux, fork is implemented using copy-on-write
pages, so the only penalty incurred by fork is the time
and memory required to duplicate the parent's page tables,
and to create a unique task structure for the child.
of course, that's the Linux man page so it doesn't say what fork does, but
how it is implemented. in fact, it doesn't share the data or stack segments;
clone by contrast will share everything.
perhaps BSD can shed more light:
Fork() causes creation of a new process. The new process (child process)
is an exact copy of the calling process (parent process) except for the
following:
o The child process has a unique process ID.
o The child process has a different parent process ID (i.e., the
process ID of the parent process).
o The child process has its own copy of the parent's descriptors.
These descriptors reference the same underlying objects, so
that, for instance, file pointers in file objects are shared
between the child and the parent, so that an lseek(2) on a
descriptor in the child process can affect a subsequent read(2)
or write(2) by the parent. This descriptor copying is also
used by the shell to establish standard input and output for
newly created processes as well as to set up pipes.
o The child process' resource utilizations are set to 0; see
setrlimit(2).
o All interval timers are cleared; see setitimer(2).
finally 7th edition UNIX, rather than its imitators:
NAME
fork - spawn new process
SYNOPSIS
fork( )
DESCRIPTION
Fork is the only way new processes are created. The new
process's core image is a copy of that of the caller of
fork. The only distinction is the fact that the value
returned in the old (parent) process contains the process ID
of the new (child) process, while the value returned in the
child is 0. Process ID's range from 1 to 30,000. This pro-
cess ID is used by wait(2).
Files open before the fork are shared, and have a common
read-write pointer. In particular, this is the way that
standard input and output files are passed and also how
pipes are set up.