From: Roderick Schertler Date: Thu, 29 Oct 1998 14:50:18 +0000 (-0500) Subject: patch for daemonization docs in perlipc X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=893af57aeb05cb9ca3ec13a262068d56558e4325;p=p5sagit%2Fp5-mst-13.2.git patch for daemonization docs in perlipc Message-ID: <17625.909690618@eeyore.ibcinc.com> p4raw-id: //depot/perl@2149 --- diff --git a/pod/perlipc.pod b/pod/perlipc.pod index 59c5ad9..cc2a1a9 100644 --- a/pod/perlipc.pod +++ b/pod/perlipc.pod @@ -317,46 +317,33 @@ details). =head2 Complete Dissociation of Child from Parent In some cases (starting server processes, for instance) you'll want to -complete dissociate the child process from the parent. The easiest -way is to use: - - use POSIX qw(setsid); - setsid() or die "Can't start a new session: $!"; - -However, you may not be on POSIX. The following process is reported -to work on most Unixish systems. Non-Unix users should check their -Your_OS::Process module for other solutions. - -=over 4 - -=item * - -Open /dev/tty and use the TIOCNOTTY ioctl on it. See L -for details. - -=item * - -Change directory to / - -=item * - -Reopen STDIN, STDOUT, and STDERR so they're not connected to the old -tty. - -=item * - -Background yourself like this: - - fork && exit; - -=item * - -Ignore hangup signals in case you're running on a shell that doesn't -automatically no-hup you: +completely dissociate the child process from the parent. This is +often called daemonization. A well behaved daemon will also chdir() +to the root directory (so it doesn't prevent unmounting the filesystem +containing the directory from which it was launched) and redirect its +standard file descriptors from and to F (so that random +output doesn't wind up on the user's terminal). + + use POSIX 'setsid'; + + sub daemonize { + chdir '/' or die "Can't chdir to /: $!"; + open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; + open STDOUT, '>/dev/null' + or die "Can't write to /dev/null: $!"; + defined(my $pid = fork) or die "Can't fork: $!"; + exit if $pid; + setsid or die "Can't start a new session: $!"; + open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; + } - $SIG{HUP} = 'IGNORE'; # or whatever you'd like +The fork() has to come before the setsid() to ensure that you aren't a +process group leader (the setsid() will fail if you are). If your +system doesn't have the setsid() function, open F and use the +C ioctl() on it instead. See L for details. -=back +Non-Unix users should check their Your_OS::Process module for other +solutions. =head2 Safe Pipe Opens