Dan Anderson wrote:
> I am learning about forks, so I tried the following code to make sure I
> had everything down:
>
> #! /usr/bin/perl
>
> use strict;
> use warnings;
>
> my $counter = 1;
> my $pid = 0;
>
> while ($counter < 50) {
> if ($pid = fork) {
> open ("FORKED", ">./fork/$counter")
> or die("COULD NOT OPEN FORK");
> print FORKED $counter;
> close("FORKED");
> $SIG{CHLD} = "IGNORE";
> }
> $counter++;
> }
>
[snip]
> So what am I doing wrong?
you are forking a lot more child than you think! what you essentially have
is:
start with 1 process, fork:
parent process
parent goes back to fork:
parent
parent goes back to fork:
parent
child
child
child goes back to fork:
parent
child
child process
child goes back to fork:
parent
parent goes back to fork:
parent
child
child
child goes back to fork:
parent
child
... etc
the number of process looks like:
1 before fork:
2 after first fork:
4 after second fork:
8 after third fork:
16 after fourth fork.
... etc
do the math for after 50 forks and you know how many process you have left
in your machine and taking up all the memory and CPU time. you need to make
sure the child does not go back to fork it's own child:
#!/usr/bin/perl -w
use strict;
$SIG{CHLD} = 'IGNORE';
for(1..50){
my $pid = fork;
die "no resource" unless(defined $pid);
next if($pid);
open(CHILd,">$_") || die $!;
print CHILD $$,"\n";
close(CHILD);
exit; #-- kill child so it does go back
}
__END__
david
--
s,.*,<<,e,y,\n,,d,y,.s,10,,s
.ss.s.s...s.s....ss.....s.ss
s.sssss.sssss...s...s..s....
...s.ss..s.sss..ss.s....ss.s
s.sssss.s.ssss..ss.s....ss.s
..s..sss.sssss.ss.sss..ssss.
..sss....s.s....ss.s....ss.s
,....{4},"|?{*=}_'y!'+0!$&;"
,ge,y,!#:$_(-*[./<[EMAIL PROTECTED],b-t,
.y...,$~=q~=?,;^_#+?{~,,$~=~
y.!-&*-/:[EMAIL PROTECTED] ().;s,;,
);,g,s,s,$~s,g,y,y,%,,g,eval
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>