Acme-Spork

 view release on metacpan or  search on metacpan

lib/Acme/Spork.pm  view on Meta::CPAN

    if(spork(\&foo)) {
        print "I am spork here me spoon\n";
    }
    else {
        print "Could not fork for spork: $!";
    }
    my $spork_pid = spork(\&foo) or die "Could not fork for for spork: $!";

=head2 %reopen_stdfhs_to

You can now have spork reopen one or more of STDIN, STDOUT, STDERR.
You define how this is handled in the Acme::Spork hash '%reopen_stdfhs_to'

The key is the STD* handle (any other values are simply ignored).

The value is an array reference of arguments to open().

Its always a good idea to local()ize it as well (and specify all 3 handles, otherwise you may get some strange warnings and behavior):

    local %Acme::Spork::reopen_stdfhs_to = (
         STDIN  => [qw(< /dev/null)],
         STDOUT => [qw(> /dev/null)],
         STDERR => [qw(> &STDOUT)],
    );
    spork(...)    
    
or you can have it set to the value above globally like so:

    use Acme::Spork qw(-reopen_stdfhs);
    ...
    spork(...)

=head2 setsid()

Say you have a custom module that is a subset of POSIX functions that includes setsid() and you'd rather use that one instead of bringing in all of POSIX.

Just define Acme::Spork::setsid ()

   sub Acme::Spork::setsid {
       require POSIX::Subset;
       POSIX::Subset::setsid();  
   }
   my $pid = spork(...);

or if you already have the module loaded:

  *Acme::Spork::setsid = *POSIX::Subset::setsid;
   my $pid = spork(...);

It will use your setsid() instead and POSIX will not be brought in. If it doesn't actually setsid() then you just broke yourself so don't do that.

=head1 daemonize()

Since many daemons need to spork a child process when a request is received I've included a cheat function to daemonize your script execution.

Its simply a wrapper for Proc::Daemon::Init.

    use Acme::Spork qw(daemonize);

    # make sure we are the only one running:
    use Unix::Pid '/var/run/this.pid';

    # if so make me a daemon:
    daemonize();

    # and redo the pid_file with the new pid
    Unix::PID->new()->pid_file('/var/run/this.pid') 
        or die 'The PID in /var/run/this.pid is still running.'; 

    # and handle requests as a server:
    while(<$incoming_requests>) {
        my $req_pid = spork(\&handle_request($_));
        if($req_pid) {
            spork(\&log_request($_), $req_pid) 
                or warn "Could not spork log request $req_pid: $!";
        }
        else {
            warn "Could not spork request: $!";
        }
    }

=head1 daemonize_without_close_on()

Same as daemonize() except it doesn't get Proc::Daemon::Init()'s POSIX::close done.
Useful if that happening causes you problems (which it has me...)

=head1 CAVEAT

If you set $SIG{CHLD} to 'IGNORE' all your $?'s will be -1 (i.e not what you might be expecting)

=head1 EXPORT

spork() is by default, daemonize() and daemonize_without_close_on() can be.

=head1 SEE ALSO

L<Proc::Daemon> is not used unless you call daemonize().

L<Unix::PID> is not used at all in this module except the daemonize() example. I figured if you were using this module you many be interested in it as well :)

=head1 ATTN modules@perl.org

I'd love to have this registered if you could find it in your heart :)

L<http://www.xray.mpe.mpg.de/mailing-lists/modules/2005-12/msg00154.html>

=head1 AUTHOR

Daniel Muey, L<http://drmuey.com/cpan_contact.pl>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006 by Daniel Muey

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.6 or,
at your option, any later version of Perl 5 you may have available.


=cut



( run in 1.064 second using v1.01-cache-2.11-cpan-df04353d9ac )