in reply to spawning Perl scripts

The system calls fork and exec are your friends. Recent versions of Perl for Windows can emulate the fork system call. I don't have any experience with Perl on Windows, but maybe you can use ActiveState's documentation as a starting point.

Arjen

Replies are listed 'Best First'.
Re: Re: spawning Perl scripts
by jand (Friar) on Mar 28, 2003 at 16:03 UTC
    fork() on Windows is emulated using threads, so I'm not sure this is the best solution in this situation (as the fork and exec idiom will not work).

    One way to start a process asynchronously is to use system() with an initial argument of 1:

    if ($^O eq "MSWin32") { system(1, "cmd_to_run arguments"); } else { # do fork and exec, or use system("cmd_to_run arguments &"); }
    The system(1, ...) call works at least on OS/2 too, and is "documented" in perlport.

      By George your right!

      I tried fork and exec, but it just waits for the long process using the win32 Apache. system(1,cmd_to_run) works fine as will system(nohup cmd_to_run &) for the unix version.

      I considered using a trigger file and a separate process, but I prefer a self contained set of scripts.

      I'm forever in your debt.

Re^2: spawning Perl scripts
by mark4 (Acolyte) on Mar 23, 2015 at 00:10 UTC
    my $kidpid = 0; my $jobs_to_fork = 3; my $i_am_the_master = 0; my $samps = 0; my $last_no = 10; my $i = 0; for ($i = 1; $i <= $jobs_to_fork; $i++) { $kidpid = fork_me($kidpid); print "$i. kidpid:$kidpid\n"; } if ($kidpid == 0) { $i_am_the_master = 1; } else { $i_am_the_master = 0; } sleep (3); if ($i_am_the_master) { print "I will look after my children\n"; } else { printf ("I am a child %6d running the program.\n", $kidpid); while ($samps < 1000000) { $rnd_no = int(rand($last_no+1)); $samps++; $total = $total+$rnd_no; } printf ("%6d: %d %f\n", $kidpid, $samps, ($total / $samps)); } sub fork_me { my $kpid = $_[0]; if ($kpid == 0) { $kpid = fork(); # the master preserves himself and start another thread } return($kpid); # the child sill just return to go do his job }

      Sorry, I am new here but I have played with perl quite a bit. Here is some code I came up with to spawn processes using fork. It works and it seems quite simple...

      my $kidpid = 0; my $jobs_to_fork = 3; my $i_am_the_master = 0; my $samps = 0; my $last_no = 10; my $i = 0; for ($i = 1; $i <= $jobs_to_fork; $i++) { $kidpid = fork_me($kidpid); print "$i. kidpid:$kidpid\n"; } if ($kidpid == 0) { $i_am_the_master = 1; } else { $i_am_the_master = 0; } sleep (3); if ($i_am_the_master) { print "I will look after my children\n"; } else { printf ("I am a child %6d running the program.\n", $kidpid); while ($samps < 1000000) { $rnd_no = int(rand($last_no+1)); $samps++; $total = $total+$rnd_no; } printf ("%6d: %d %f\n", $kidpid, $samps, ($total / $samps)); } sub fork_me { my $kpid = $_[0]; if ($kpid == 0) { $kpid = fork(); # the master perserves himself and start another t +hread } return($kpid); # the child sill just return to go do his job }