On 5/15/06, Tom Allison <[EMAIL PROTECTED]> wrote:

  my $pid = fork();
  print "$pid --> $file\n";

Because your process table can become full and temporarily prevent
forking new processes, you should check the return value of fork
whenever you're making more than N processes. The value of N depends
upon a number of factors, so I generally assume N=0. Most of the time,
I just call this safe_fork routine in place of fork, since this
handles the retries for me automatically.

  sub safe_fork () {
      use Errno;
      my $retries = 10;
      while ($retries--) {
          my $rv = fork;
          return $rv if defined $rv;  # it worked
          return unless $retries;
          return unless $!{EAGAIN};
          sleep 3;
      }
      die "Well, how did I get here?";
  }

I will get an output of:
0 --> file_one
3242 --> file_one
0--> file_two

but no 3243-->file_two.

If that output is coming from several concurrent processes, any one
process's output can "interrupt" another: The data may be interleaved
in confusing ways. But maybe you simply couldn't fork another process?
How many processes were you starting at once?

Unfortunately, perl -d doesn't work well for forks.

There's actually some support for fork in the debugger, but I'm having
a hard time finding any documentation on it, other than the comments.
Search for 'fork' in your perl5db.pl file, if you need it.

Good luck with it!

--Tom Phoenix
Stonehenge Perl Training

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to