What jethro said: Only fork if you need to do something in both processes.
If that's the case, here is a working example:
#!/usr/bin/env perl
use 5.014;
use strict;
use warnings;
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
# client process
say "Client starting...";
sleep 10; # do something useful instead!
say "Client terminating";
exit 0;
}
else {
# parent process
say "Parent process, waiting for child...";
# do something useful here!
waitpid $pid, 0;
}
say "Parent process after child has finished";
One thing to note is that fork returns undef on failure, and undef == 0 compares as true, so your error handling wouldn't work. To easily test the error case, start a new bash and set ulimit -u $number_of_allowed_processes, then start the perl script.