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