When using fork( ), you should check its return
value, since a return of undef it means that the
call was unsuccessful and no process was spawned. This can happen for
example, when the system is already running too many processes and
cannot spawn new ones.

When the process is successfully forked, the parent receives the PID
of the newly spawned child as a returned value of the fork(
) call and the child receives 0. Now the
program splits into two. In the above example, the code inside the
first block after if will be executed by the
parent, and the code inside the first block after
else will be executed by the child.

It's important not to forget to explicitly call
exit( ) at the end of the child code when forking.
If you don't and there is some code outside the
if...else block, the child process will execute it
as well. But under mod_perl there is another nuance—you must
use CORE::exit( ) and not exit(
), which would be automatically overriden by
Apache::exit( ) if used in conjunction with
Apache::Registry and similar modules. You want the
spawned process to quit when its work is done, or
it'll just stay alive, using resources and doing
nothing.

The parent process usually completes its execution and returns to the
pool of free servers to wait for a new assignment. If the execution
is to be aborted earlier for some reason, you should use
Apache::exit( ) or die( ). In
the case of Apache::Registry or
Apache::PerlRun handlers, a simple exit(
) will do the right thing.