in reply to launch and then exit out of app

Check this out AM:

my $child=fork(); # Spawn off a child if ($child>0) { #parent exec ($app1) || die "Could not exec $app1:$!"; exit(0); # Should never get here! } elsif ($child == 0 ) { # Child process exec ($app2) || die "Could not exec $app2:$!"; exit(0); # should never get here either } else { die "Could not fork! $!"; }
For doing spawning and dying parents I much prefer the mehodology of using an exec instead of system. Evaluating $! will give you the reason you couldn't spawn the exec'ed process.

As always in Perl TIMTOWTDI and YMMV. One thing you didn't specify is what platform you are attempting this feat of derring do...


Peter L. Berghold -- Unix Professional
Peter at Berghold dot Net
   Dog trainer, dog agility exhibitor, brewer of fine Belgian style ales. Happiness is a warm, tired, contented dog curled up at your side and a good Belgian ale in your chalice.

Replies are listed 'Best First'.
Re: Re: launch and then exit out of app
by Anonymous Monk on Feb 03, 2004 at 19:24 UTC
    Hi, I run it on Windows 2000. I tried what you suggested by using 'exec' instead of 'system', but it only launches 1 app and then exit !?!

          I run it on Windows 2000.

      Hence my comment about your not specifying which OS you were attempting this on. It is known that fork() doesn't always play nice on Windows.

      Suggest you look at the solution proposed by brer flyingmoose here. In order to do the exit that you ask for replace his line that says $proc->wait(); with exit(0); and you should be OK.

      DISCLAIMER: Don't have a Windows 2000 box to test this on so do your own testing


      Peter L. Berghold -- Unix Professional
      Peter at Berghold dot Net
         Dog trainer, dog agility exhibitor, brewer of fine Belgian style ales. Happiness is a warm, tired, contented dog curled up at your side and a good Belgian ale in your chalice.
        cowdawg: I'm going to remove the line regarding the wait. Good catch.

      I run it on Windows 2000.

      Then you could use the Win32::Job module, standard with ActivePerl 5.8. For example:

      use strict; use Win32::Job; my @cmds = ( [ "netstat", 'netstat -na' ], [ $^X, 'perl -le "print\"pid=$$:Sleep 5 secs.\";sleep 5"' ], ); my $job = Win32::Job->new(); my @pids; my $i = 0; for my $cmd (@cmds) { ++$i; my $pid = $job->spawn($cmd->[0], $cmd->[1], { stdin => 'NUL', stdout => "$i.out", stderr => "$i.err" } ) or die "spawn: $^E"; push(@pids, $pid); } print "Processes pids: @pids are running...\n"; $job->run(60); # allow up to 60 seconds for all processes to end print "Job complete (output in files 1.out/1.err/2.out/2.err).\n"; my $stat = $job->status(); for my $pid (@pids) { exists($stat->{$pid}) or die "oops, no status for $pid"; my $rc = $stat->{$pid}->{exitcode}; my $t = $stat->{$pid}->{time}; print "pid=$pid, rc=$rc, elapsed time=$t->{elapsed} secs\n"; }

      Update: Sorry, on re-reading your question, I don't think Win32::Jobs will help you. I suggest you simply launch the processes using Win32::Process (also standard with ActivePerl) and exit.

      use strict; use Win32::Process; my $SysDir = "$ENV{SystemRoot}\\system32"; my @cmds = ( [ "$SysDir\\netstat.exe", 'netstat -na' ], [ $^X, 'perl -le "print\"pid=$$:Sleep 5 secs.\";sleep 5"' ], ); for my $cmd (@cmds) { Win32::Process::Create(my $hProc, # process object $cmd->[0], # executable $cmd->[1], # command line 1, # inherit handles NORMAL_PRIORITY_CLASS, # priority '.') # working dir or die "error create process: $^E\n"; my $pid = $hProc->GetProcessID(); print "Process pid $pid launched.\n"; } print "I'm outta here.\n";