The whole point of the fork system call is (a little simplified) to make a copy of the process - from the point of the fork call onwards there are two copies of your code executing. In one of them, fork() returns the PID of the child (that's the parent), and in the other (the child), it returns 0. So yes, both the if and elsif blocks are supposed to be executed, but in different processes.
Try prefixing all of your output with the current PID, $$:
#!/usr/bin/env perl
use warnings;
use strict;
print "[$$] Starting main program\n";
my @childs;
for my $count (1..3) {
if ( my $pid = fork ) { # parent
print "[$$] child pid is $pid\n";
push @childs, $pid;
}
elsif ( defined $pid ) { # child
sub1($count);
exit 0;
}
else
{ die "[$$] couldn't fork: $!" }
}
for my $pid (@childs) {
my $tmp = waitpid($pid, 0);
print "[$$] done with pid $tmp\n";
}
print "[$$] End of main program\n";
sub sub1 {
my $num = shift;
print "[$$] started child process for $num\n";
sleep $num;
print "[$$] done with child process for $num\n";
return $num;
}
Which outputs, for example:
[7685] Starting main program
[7685] child pid is 7686
[7686] started child process for 1
[7685] child pid is 7687
[7687] started child process for 2
[7685] child pid is 7688
[7688] started child process for 3
[7686] done with child process for 1
[7685] done with pid 7686
[7687] done with child process for 2
[7685] done with pid 7687
[7688] done with child process for 3
[7685] done with pid 7688
[7685] End of main program
Which looks fine to me. You get three children executing sub1 and a parent that manages the children.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.