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
广告