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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告