2011-02-22 187 views
0

在vfork系統調用中,父進程和子進程共享頁面,子進程發生的任何全局變量變化(比如說)都會反映到父進程中,一旦它返回。現在,如果我們從子進程執行exec()系統調用,它會將指定的程序加載到子進程的地址空間中,當父進程再次變爲活動狀態時,是否會發現已損壞的數據和堆棧框架(通過子進程加載新的二進制文件)? 請回復,Vfork系統調用

回答

0

不,內核安排這不成問題。我不記得具體細節了,但一般程序是:當進程調用vfork時,內核保存堆棧指針和PC,併爲子進程執行部分設置。當名爲vfork的進程調用execve時,內核將爲新的程序映像創建一個新的地址空間,而不是覆蓋調用進程的地址空間。然後它將父母的堆棧指針和PC恢復到原來的狀態,父母從vfork處繼續。

vfork在線聯機手冊是令人失望的模糊,而且往往有關於它的效用的危險,缺乏,這是不公平的尖刻評論 - 這真的是比fork更有效,即使寫入時複製地址空間的共享,因爲它不需要刷新TLB或在內核中執行幾乎一樣的工作,並且它的語義在各種仍然廣泛使用的操作系統中相當一致。錯誤處理是屁股疼痛,但如果你認真對待,錯誤處理與簡單的fork一樣糟糕。

[有誰知道在vforkexecve之間做I/O重定向安裝是否安全?該標準不保證它,並且manpages也沒有,但是我的回憶是在該窗口中的打開/關閉/ dup操作僅影響待定孩子,如同fork。]

+0

+1第一段;我抵制了第二段做-1的誘惑。 – 2011-03-29 04:01:40