sub become_daemon { my $dont_die = shift || 0; my ($child, $sig); $child = fork; if (defined $child) { exit 0 if $child; } else { $dont_die && return "Error in fork: $!"; die "$0 died in fork: $!, dead"; } # # First-generation child. # setpgrp; close(STDIN); close(STDOUT); close(STDERR); chdir '/'; umask 0; for (qw(TSTP TTIN TTOU)) { $SIG{$_} = 'IGNORE' if (exists $SIG{$_}) } # # In case of SysV, re-spawn to avoid danger of re-acquiring a control # terminal. Now the child is not the pgrp leader. # $sig = $SIG{HUP}; $SIG{HUP} = 'IGNORE'; $child = fork; if (defined $child) { exit 0 if $child; } elsif ($child) { $dont_die && return "Error in (1st-generation child) fork: $!"; die "$0 (1st-generation child) died in fork: $!, dead"; } # # Restore HUP (which will probably be set later on, anyway) and return. # $SIG{HUP} = $sig; return; }