On Tue, Aug 24, 2004 at 03:59:57PM -0500, Errin Larsen wrote:
> As I understand what's going on, the Process (let's say PID=100)
> spawns a child with the fork() function (let's say PID=200).  This
> (200) is assigned to $pid in the parent, and zero (0) is assigned to
> $pid in the child.  So, what does "my $pid=fork()" resolve to in each
> case?  I'll assume that it resolves to the PID that fork returns.  So,
> in the parent, the statement resolves to 200 and the unless statement
> doesn't resolve.  In the child, the statement resolves to 0 and the
> unless statement DOES resolve.  So, the parent prints a message to
> STDOUT and quits, while the child keeps on running (in the little
> do/while loop) doing that stuff that's in there :)  

That sounds about right.  At the fork() call the program spawns into two
processes; the child gets 0 back from fork() (if it wants to know its own
pid, it can just look at $$) and the parent gets the child's pid back (in
case it wants to send signals to the child).  You'll notice a lot of
daemons store the child pid in /var/run, e.g., apache.pid, so when you
call the daemon script later it can send the proper signal to the
now-detached child.

Usually, you'll want to implement custom signal handling in the child
(i.e., local $SIG{HUP} = \&SomeCode).

> Ok ... so, um, why go through all this?  Why not just write your
> do/while block and just execute it in the background on the command
> line?  is fork() doing something else that helps a daemon that I'm not
> aware of?  

I guess primarily because you don't want your user to have to background
the task.  If you're writing a daemon script thats going to go in
/etc/init.d, it has to detach itself--the initscripts aren't going to
put it in the background for you.

If you background a task from the shell, then the shell will be its
parent.  If you detach a daemon like my code sample below, the parent
dies and the child is adopted by init (pid 1).  I can't think off the top
of my head why this is important, but it is a difference.

I think just as a matter of good programming style, if your program is
always suppose to background itself, you should have the program
background itself, rather than relying on the user to background it.

> On Sat, 21 Aug 2004 09:53:23 -0400, Adam Rosi-Kessel
> > Here's the skeleton of it:
> > 
> > ----
> > unless (my $pid = fork()) {
> >   do {
> >      &SendEmailToUsers;
> >      sleep 3 * 24 * 60 * 60;
> >   } while (1);
> > }
> > 
> > print "Starting email daemon...\n";
-- 
Adam Rosi-Kessel
http://adam.rosi-kessel.org

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to