Perl 中的 fork() 函数


Perl 提供了一个 **fork()** 函数,它对应于同名的 Unix 系统调用。在大多数可使用 fork() 系统调用的类 Unix 平台上,Perl 的 fork() 只是简单地调用它。在某些平台(如 Windows)上,fork() 系统调用不可用,Perl 可以构建在解释器级别模拟 fork()。

fork() 函数用于克隆当前进程。此调用创建一个新的进程,运行相同的程序并在同一点运行。它将子进程 ID 返回给父进程,将 0 返回给子进程,或者在 fork 不成功时返回负值。

您可以在进程中使用 **exec()** 函数来启动请求的可执行文件,该文件将在单独的进程区域中执行,并且 exec() 将等待其完成,然后以与该进程相同的退出状态退出。

示例

 在线演示

#!/usr/bin/perl
if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process\n";
   $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";
}
1;

输出

执行上述代码时,会产生以下结果:

Printed by parent process
Printed by child process
Tue Sep 17 15:41:08 CDT 2013
Completed process id: 17777

**wait()** 和 **waitpid()** 可以作为 fork() 返回的伪进程 ID 传递。这些调用将正确等待伪进程的终止并返回其状态。如果您使用 fork 但从未使用 **waitpid()** 函数等待子进程,则会累积僵尸进程。在 Unix 系统上,您可以通过将 $SIG{CHLD} 设置为“IGNORE”来避免这种情况,如下所示:

示例

 在线演示

#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE";
if(!defined($pid = fork())) {
   # fork returned undef, so unsuccessful
   die "Cannot fork a child: $!";
} elsif ($pid == 0) {
   print "Printed by child process\n";
   exec("date") || die "can't exec date: $!";
} else {
   # fork returned 0 nor undef
   # so this branch is parent
   print "Printed by parent process\n";
   $ret = waitpid($pid, 0);
   print "Completed process id: $ret\n";
}
1;

输出

执行上述代码时,会产生以下结果:

Printed by parent process
Printed by child process
Tue Sep 17 15:44:07 CDT 2013
Completed process id: -1

更新于: 2019年12月2日

4K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告