> 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.

Reply via email to