You don't want system for this; it doesn't return until the called process exits. You can do what you're trying with fork.
Here's one way of writing it,
$SIG{CHLD} = 'IGNORE'; # or arrange to wait at end
# Start the server
my $server_path = $bin . $server;
my $spid = fork;
die $! unless defined $spid;
exec $server_path or die $! unless $spid;
# Start up the client
my $client_path = $bin . $client;
my $cpid = fork;
die $! unless defined $cpid;
exec $client_path or die $! unless $cpid;
Update: GaijinPunch, 'Killed' is what the kernel prints when it destroys a process for violating something or other - most often seen in perl when you run the system out of memory. I think robartes suggestion of the cause as bad socket allocation is as good as any, though you should look at memory use as well. muntfish, that usage depends on exec calling a utility through the shell instead of directly. That obscures error handling and is often fragile. The code above should have more than one argument to exec (or an indirect object) just to make sure that the server and client are called directly, but I didn't want to confuse the issue with bogus arguments.