fork

fork(2) 系統呼叫以相同點創建新的進程運行相同程序。它將子進程的 pid 返回給父進程,對子進程返回 0,如果 fork 不成功,則返回 undef。文件描述符(有時是這些描述符上的鎖)是共享的,而其他所有內容則是複製的。在大多數支持 fork(2) 的系統上,都非常注重使其極其高效(例如,在數據頁上使用寫時複製技術),使其成為過去幾十年中多任務處理的主要範例。

Perl 嘗試在派生子進程之前刷新所有以輸出打開的文件,但這可能在某些平台上不受支持(請參見 perlport)。為了安全起見,您可能需要設置 $|$AUTOFLUSHEnglish 中)或者在任何打開的句柄上調用 IO::Handleautoflush 方法,以避免重複輸出。

如果您在不等待子進程的情況下 fork,則會積累殭屍進程。在某些系統上,您可以通過將 $SIG{CHLD} 設置為 "IGNORE" 來避免這種情況。另請參見 perlipc,了解更多有關派生和回收樣式的示例。

請注意,如果您的分支子程序繼承系統文件描述符,如標準輸入和標準輸出,而這些描述符實際上是通過管道或套接字連接的,即使您退出,遠程伺服器(例如,CGI 腳本或從遠程 shell 啟動的背景作業)也不會認為您已經完成。如果有任何問題,您應該將這些重新打開到 /dev/null

在某些平台上,例如 Windows,其中 fork(2) 系統呼叫不可用時,Perl 可以建立編譯為模擬 Perl 解釋器中的 fork。在 Perl 程式的層面上,模擬旨在與“Unix” fork(2) 尽可能兼容。但是,必須考慮到這種模擬存在的限制,這些限制可能影響可移植的代碼。請參閱 perlfork 以獲取更多詳細信息。

可移植性問題:perlport 中的 "fork"