in reply to Re: launch and then exit out of app
in thread launch and then exit out of app

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 !?!
  • Comment on Re: Re: launch and then exit out of app

Replies are listed 'Best First'.
Re: Re: Re: launch and then exit out of app
by blue_cowdawg (Monsignor) on Feb 03, 2004 at 19:32 UTC

        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.
Re: Re: Re: launch and then exit out of app
by eyepopslikeamosquito (Archbishop) on Feb 04, 2004 at 01:52 UTC

    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";