perlfork - Perl's fork() emulation
| Use Case | Command | Description |
|---|---|---|
| Fork a child pseudo-process | my $pid = fork(); | Clones the interpreter; parent returns child PID, child returns 0 |
| Wait for a child | waitpid($pid, 0); | Wait for a specific pseudo-process to terminate and get its status |
| Terminate a child (dangerous) | kill('KILL', $pid); | Unsafe; may cause memory leaks or hang. Prefer kill('TERM', $pid) |
| Execute external program in child | exec('program', @args); | Spawns external process, waits for it, then exits child |
| Exit a child pseudo-process | exit(); | Exits only the current pseudo-process after waiting for its children |
Simulate open(FOO, "|-") | See Forking pipe open() not yet implemented in CAVEATS | Workaround: create pipe explicitly and fork |
NOTE: As of the 5.8.0 release, fork() emulation has considerably matured. However, there are still a few known bugs and differences from real fork() that might affect you. See the BUGS and CAVEATS AND LIMITATIONS sections below.
Perl provides a fork() keyword that corresponds to the Unix system call of the same name. On most Unix-like platforms where the fork() system call is available, Perl's fork() simply calls it.
On some platforms such as Windows where the fork() system call is not available, Perl can be built to emulate fork() at the interpreter level. While the emulation is designed to be as compatible as possible with the real fork() at the level of the Perl program, there are certain important differences that stem from the fact that all the pseudo child "processes" created this way live in the same real process as far as the operating system is concerned.
This document provides a general overview of the capabilities and limitations of the fork() emulation. Note that the issues discussed here are not applicable to platforms where a real fork() is available and Perl has been configured to use it.
The fork() emulation is implemented at the level of the Perl interpreter. What this means in general is that running fork() will actually clone the running interpreter and all its state, and run the cloned interpreter in a separate thread, beginning execution in the new thread just after the point where the fork() was called in the parent. We will refer to the thread that implements this child "process" as the pseudo-process.
To the Perl program that called fork(), all this is designed to be transparent. The parent returns from the fork() with a pseudo-process ID that can be subsequently used in any process-manipulation functions; the child returns from the fork() with a value of 0 to signify that it is the child pseudo-process.
Most Perl features behave in a natural way within pseudo-processes.
kill('KILL', ...) can be used to terminate a pseudo-process by passing it the ID
returned by fork(). The outcome of kill on a pseudo-process is unpredictable and it
should not be used except under dire circumstances, because the operating system may not
guarantee integrity of the process resources when a running thread is terminated. The
process which implements the pseudo-processes can be blocked and the Perl interpreter
hangs. Note that using kill('KILL', ...) on a pseudo-process() may typically cause
memory leaks, because the thread that implements the pseudo-process does not get a
chance to clean up its resources.kill('TERM', ...) can also be used on pseudo-processes, but the signal will not be
delivered while the pseudo-process is blocked by a system call, e.g. waiting for a
socket to connect, or trying to read from a socket with no data available. Starting in
Perl 5.14 the parent process will not wait for children to exit once they have been
signalled with kill('TERM', ...) to avoid deadlock during process exit. You will have
to explicitly call waitpid() to make sure the child has time to clean-up itself, but you
are then also responsible that the child is not blocking on I/O either.In the eyes of the operating system, pseudo-processes created via the fork() emulation are simply threads in the same process. This means that any process-level limits imposed by the operating system apply to all pseudo-processes taken together. This includes any limits imposed by the operating system on the number of open file, directory and socket handles, limits on disk space usage, limits on memory size, limits on CPU utilization etc.
If the parent process is killed (either using Perl's kill() builtin, or using some external means) all the pseudo-processes are killed as well, and the whole process exits.
During the normal course of events, the parent process and every pseudo-process started by it will wait for their respective pseudo-children to complete before they exit. This means that the parent and every pseudo-child created by it that is also a pseudo-parent will only exit after their pseudo-children have exited.
Starting with Perl 5.14 a parent will not wait() automatically for any child that has been
signalled with kill('TERM', ...) to avoid a deadlock in case the child is blocking on I/O and
never receives the signal.
BEGIN {
fork and exit; # fork child and exit the parent
print "inner\n";
}
print "outer\n";
This will print:
inner
rather than the expected:
inner
outer
This limitation arises from fundamental technical difficulties in cloning and restarting
the stacks used by the Perl parser in the middle of a parse.exit() from a child
process will flush and close open filehandles in the parent, thereby corrupting the
filehandles. On these systems, calling _exit() is suggested instead. _exit() is
available in Perl through the POSIX module. Please consult your system's manpages for
more information on this.open(FOO, "|-") and open(BAR, "-|") constructs are not yet implemented. This
limitation can be easily worked around in new code by creating a pipe explicitly. The
following example shows how to write to a forked child:
# simulate open(FOO, "|-")
sub pipe_to_fork ($) {
my $parent = shift;
pipe my $child, $parent or die;
my $pid = fork();
die "fork() failed: $!" unless defined $pid;
if ($pid) {
close $child;
}
else {
close $parent;
open(STDIN, "<&=" . fileno($child)) or die;
}
$pid;
}
if (pipe_to_fork('FOO')) {
# parent
print FOO "pipe_to_fork\n";
close FOO;
}
else {
# child
while (<STDIN>) { print; }
exit(0);
}
And this one reads from the child:
# simulate open(FOO, "-|")
sub pipe_from_fork ($) {
my $parent = shift;
pipe $parent, my $child or die;
my $pid = fork();
die "fork() failed: $!" unless defined $pid;
if ($pid) {
close $child;
}
else {
close $parent;
open(STDOUT, ">&=" . fileno($child)) or die;
}
$pid;
}
if (pipe_from_fork('BAR')) {
# parent
while (<BAR>) { print; }
close BAR;
}
else {
# child
print "pipe_from_fork\n";
exit(0);
}
Forking pipe open() constructs will be supported in future.In portable Perl code, kill(9, $child) must not be used on forked processes. Killing a forked
process is unsafe and has unpredictable results. See kill(), above.
Support for concurrent interpreters and the fork() emulation was implemented by ActiveState, with funding from Microsoft Corporation.
This document is authored and maintained by Gurusamy Sarathy <gsar AT activestate.com>.
fork in perlfunc, perlipc
Generated by phpman v4.10.0-7-g98e9fd5 · Markdown · JSON · MCP Author: Che Dong Under GNU General Public License
2026-09-17 15:38 @216.73.216.79
CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)