# in wrapper . . . use Fcntl qw( F_GETFD F_SETFD FD_CLOEXEC ); open( LOG, "/path/to/log" ) or die "open log: $!\n"; $ENV{LOG_FD} = fileno( LOG ); my $flags = fcntl( LOG, F_GETFD ) or warn "getfd: $!\n"; fcntl( LOG, F_SETFD, $flags & ~FD_CLOEXEC ) or warn "setfd: $!\n"; $< = $> = uid_to_run_as( ... ); exec "/path/to/real/program", @prog_args or die "Can't exec real program: $!\n"; # in your module sub log_it { local( *LOG ); open( LOG, "<&=" . $ENV{LOG_FD} ) or die "Can't dup log fd: $!\n"; print LOG, "Ack: ", @_, "\n"; }