sub fork_job { my $job = shift; my $system_fail = 0; system( "ls . " ) == 0 || print "system failed before forking\n" my $pid = fork(); if( !defined( $pid ) ) { # bad, bad, error return 0; } elsif ($pid != 0) { # parent return $pid; } elsif ($pid == 0) { # $child system( "ls . " ) == 0 || print "system failed after forking(1)\n"; $> = $job->{'uid'}; $< = $job->{'uid'}; system( "ls . " ) == 0 || print "system failed after forking(2)\n"; setpgrp(0, $$); system( "ls . " ) == 0 || print "system failed after forking(3)\n"; ## doesn't exec, but continues on my $runner = Runner->new( $job ); $runner->run(); exit 1; } }