在vfork系統調用中,父進程和子進程共享頁面,子進程發生的任何全局變量變化(比如說)都會反映到父進程中,一旦它返回。現在,如果我們從子進程執行exec()系統調用,它會將指定的程序加載到子進程的地址空間中,當父進程再次變爲活動狀態時,是否會發現已損壞的數據和堆棧框架(通過子進程加載新的二進制文件)? 請回復,Vfork系統調用
0
A
回答
0
不,內核安排這不成問題。我不記得具體細節了,但一般程序是:當進程調用vfork
時,內核保存堆棧指針和PC,併爲子進程執行部分設置。當名爲vfork
的進程調用execve
時,內核將爲新的程序映像創建一個新的地址空間,而不是覆蓋調用進程的地址空間。然後它將父母的堆棧指針和PC恢復到原來的狀態,父母從vfork
處繼續。
爲vfork
在線聯機手冊是令人失望的模糊,而且往往有關於它的效用的危險,缺乏,這是不公平的尖刻評論 - 這真的是比fork
更有效,即使寫入時複製地址空間的共享,因爲它不需要刷新TLB或在內核中執行幾乎一樣的工作,並且它的語義在各種仍然廣泛使用的操作系統中相當一致。錯誤處理是屁股疼痛,但如果你認真對待,錯誤處理與簡單的fork
一樣糟糕。
[有誰知道在vfork
和execve
之間做I/O重定向安裝是否安全?該標準不保證它,並且manpages也沒有,但是我的回憶是在該窗口中的打開/關閉/ dup操作僅影響待定孩子,如同fork
。]
相關問題
- 1. 系統(「」)調用
- 2. 重要性內核級系統的要求叉,vfork的
- 3. 系統調用和系統程序
- 4. MIPS:系統調用
- 5. 調用C「系統」 ++
- 6. Ptracing系統調用
- 7. 調用android系統
- 8. Pipe()系統調用
- 9. sys_execve系統調用
- 10. 管系統調用
- 11. python系統調用
- 12. indir系統調用
- 13. 系統調用庫
- 14. sigaction系統調用
- 15. fork系統調用
- 16. 系統調用Perl
- 17. 系統調用ARM
- 18. 系統調用write
- 19. Linux系統調用
- 20. XV6加計數系統的系統調用調用
- 21. FreeBSD從另一個系統調用發出系統調用
- 22. 從系統調用用C
- 23. 使用write()系統調用
- 24. 使用read()系統調用
- 25. 使用fork系統調用
- 26. 使用系統調用
- 27. 系統()調用用C
- 28. 雙叉使用vfork
- 29. 忽略系統調用
- 30. Sigsuspend系統調用問題
+1第一段;我抵制了第二段做-1的誘惑。 – 2011-03-29 04:01:40