Have a look at the
Net::Server modules. They take care of the network and forking stuff for you. You only have to write a subroutine that the child will run.
I ran the posted code but replaced the
e-mail function here comments with
print "A\n" and
print "B\n". I found both letters were printed to the same terminal the program was run from just as expected. This was the case both with and without the
&. I am running Fedora 6. Your OS might behave differently.
Something else I noticed is the parent process in that code does not
wait for the child to exit. The result is your system will accumulate
zombie processes. Another option is before any forking code include
$SIG{'CHLD'}="IGNORE";
Also running a process in the background (with the
&) is not quite the same as daemonizing a process. See
Unix Programming FAQ 1.7 : How do I get my program to act like a daemon? for a description of daemonizing.