执行一个 fork(2) 系统调用,创建一个新的进程,运行相同的程序,从相同的点开始。它向父进程返回子进程的 pid,向子进程返回 0
,如果 fork 不成功则返回 undef
。文件描述符(以及有时对这些描述符的锁定)是共享的,而其他所有内容都被复制。在大多数支持 fork(2) 的系统上,人们非常小心地使其变得极其高效(例如,在数据页上使用写时复制技术),使其在过去几十年中成为多任务处理的主要范式。
Perl 尝试在 fork 子进程之前刷新所有打开的输出文件,但这可能在某些平台上不受支持(参见 perlport)。为了安全起见,您可能需要设置 $|
(在 English 中为 $AUTOFLUSH
)或在任何打开的句柄上调用 IO::Handle
的 autoflush
方法,以避免重复输出。
如果您 fork
但从未等待您的子进程,您将积累僵尸进程。在某些系统上,您可以通过将 $SIG{CHLD}
设置为 "IGNORE"
来避免这种情况。有关 fork 和收割垂死子进程的更多示例,请参见 perlipc。
请注意,如果您的 fork 子进程继承了系统文件描述符(如 STDIN 和 STDOUT),这些描述符实际上通过管道或套接字连接,即使您退出,远程服务器(例如,CGI 脚本或从远程 shell 启动的后台作业)也不会认为您已完成。如果您有任何问题,您应该将这些文件重新打开到 /dev/null。
在某些平台(如 Windows)上,fork(2) 系统调用不可用,Perl 可以构建为在 Perl 解释器中模拟 fork
。模拟旨在从 Perl 程序的级别上尽可能地与“Unix” fork(2) 兼容。但是,它有一些限制,在编写旨在可移植的代码时必须考虑这些限制。有关更多详细信息,请参见 perlfork。
可移植性问题:"fork" in perlport.