這個函式通過呼叫 fork(2) 系統呼叫,從乙個程序中建立兩個程序。如果它成功,該函式給父程序返回新建立的子程序 id,而給子程序返回 0。如果系統沒有足夠的資源分配乙個新的程序,那麼呼叫失敗並返回 undef。檔案描述符(以及有時候還有在那些描述符上的鎖)是共享的,而所有其他的東西都是拷貝的——或者至少看起來是那樣的。
在早於 5.6 版本的 perl 裡,未沖刷的緩衝區在兩個程序裡都是沒有沖刷的,這就意味著你需要在程式的早些時候在乙個或多個檔案控制代碼上設定 $| 以避免輸出重複。
乙個產生子程序然而有檢查「cannot fork」錯誤的近乎沒有毛病的方法是:
use errno qw(eagain);fork:
elsif (defined $pid)
elsif ($! == eagain)
else
}
這些預防措施在那些做隱含的 fork(2) 的操作上是不必要的,比如 system,反勾號,或者把乙個程序當作乙個檔案控制代碼開啟,因為 perl 在為你做 fork 的時候碰到臨時的失敗會自動重新嘗試 fork。要注意記得使用 exit 結束子程序的**,否則子程序會不小心地離開條件塊並且開始執行原來只是想讓父程序執行的**。
如果你 fork 以後再也不等待你的子程序,那麼你就會積累僵死程序(那些父程序還沒等待它們的退出程序)。在一些系統上,你可以通過設定 $sig 為「ignore」來避免這些;在大多數系統上,你必須 wait 你的垂死的子程序。參閱 wait 函式獲做這些的例子,或則後參閱第十六章的「訊號」一節獲取更多關於 sigchld 的資訊。
如果乙個派生出來的子程序繼承了系統檔案描述符,象 stdin 和 stdout 等,它們又和乙個遠端的管道或者套接字連線,那麼你可能不得不在子程序裡把他們重新開啟到 /dev/null。這是因為即使父程序退出,子程序仍將帶著這些檔案控制代碼的拷貝繼續生存。而遠端伺服器(比如說,乙個 cgi 指令碼或者乙個從遠端 shell 發起的後台任務。)就會掛起,因為它仍然等待所有拷貝關閉。重新把系統檔案控制代碼開啟成別的什麼東西可以修補這個問題。
在大多數支援 fork(2) 的系統上,人們做了大量努力把它變得盡可能地高效(比如,資料頁的寫時拷貝(copy-on-write)技術),而它也成了過去幾十年來多工領域的典範。但是 fork 函式可能並沒有有效地(甚至可能是根本沒有)在那些不象 unix 的系統上實現。比如, perl 5.6 甚至在 microsoft 系統上都模擬了乙個合適的 fork,但是並不能保證可以達到很好的效能。可能用 win32::process 模組的時候,你的運氣會好一些。
fork 函式說明
fork 函式用於建立程序,一般是用下面的 呼叫 pid fork 呼叫上面函式後就建立了乙個子程序,同時 父程序還繼續執行。兩個程序往下繼續執行的起點 都是這個函式之後,在這個函式之前的執行,父程序 和子程序是完全一樣的。這個函式之後,父程序中 pid 則不等於 0,而子程序中 pid 等於0,所...
perl函式說明 chroot
chroot chroot filename chroot如果成功,filename 成為當前程序的新的根目錄 用 開頭的路徑名的起點。這個目錄是跨 exec 呼叫繼承的,以及被所有 chroot 呼叫後 fork 出來的子程序繼承。我們沒有辦法撤消一次 chroot。出於安全原因,只有超級使用者可...
perl函式說明 close
close close filehandle close這個函式關閉與 filehandle 關聯的檔案,套接字,或者管道。如果省略引數,那麼它關閉當前選定的檔案控制代碼。如果關閉成功它返回真,否則返回假。如果你準備馬上就對 filehandle 做另外一次 open,那麼你用不著關閉它,因為下一次...