2
A
回答
7
這裏是我的理解:
- 待辦事項C++類活下來分叉?
是的。
- 如果是這樣,它是如何實現的?
所有的內存被複制,所以你沒有任何問題。
- 指針會發生什麼變化?整個免費商店/堆被複制,所有的虛擬地址被保留?
是的。
- 文件流會怎樣?
這兩個進程保留所有打開的文件流的副本。 (默認情況下,有一些分支選項可以改變我的想法。) fork之後打開的流不共享。
3
這可以很容易地通過鍵入man fork
回答:
「孩子繼承打開文件描述符的父母的一套複印件。」
基本上,子進程將在完全相同的狀態父「父的整個虛擬地址空間中的孩子重複」(但看到一個男人頁這個極其過分簡單的陳述的例外清單)。
它是如何實現的?你想要什麼水平的細節?內存可能被實現爲寫時複製。但這不是你的擔心,子進程只是獲得整個內存的精確副本。
6
首先,要知道,這種行爲是非常平臺依賴。如果您除了好奇之外還有其他問題,我可以建議您重新考慮一下您的設計嗎?
這就是說,什麼是和不保留的叉由the POSIX standard指定。如何爲C++解釋這一點取決於你的C++(用戶空間)運行時是如何實現的。
文件流是一個有趣的案例。基礎文件描述符將被克隆,因此兩個進程都會有一個開放的描述符。但用戶空間緩衝區(如果有的話)最有可能得到重複。所以,舉例來說:
std::cout << "Hello!";
fork();
std::cout << std::endl;
...有着相當不錯的打印Hello!
兩次,僅僅是因爲緩衝區將得到(以及在這個過程中的地址空間中的一切)複製的機會。
總之,我會回答你的問題:
這取決於類和你所說的「生存」的意思。
它通過複製進程的整個虛擬地址空間來實現。
指針保持它們的值,並且它們指向的內容被複制。 (這是「懶惰地」完成的;即作爲「寫入時複製」,因此它不像聽起來那樣低效)。
(re:文件流)參見上面。
相關問題
- 1. 分叉子進程
- 2. 進程分叉,子進程等[Java]
- 3. 如何用電子分叉子進程
- 4. php進程分叉和獲取子進程號
- 5. 分叉進程
- 6. 防止在子進程中分叉
- 7. 分叉後退出子進程
- 8. 分叉的子進程掛在node.js
- 9. C++進程中空/動態分叉
- 10. 如何與進程分叉共享對象樹?
- 11. 發送Socket對象分叉正在運行的進程(multiprocessing.Queue)
- 12. C父進程無限期地等待分叉的子進程運行authopen
- 13. 在子進程中使用紅寶石殺死分叉進程
- 14. 分叉父進程退出後跳回到子進程
- 15. C中的多進程,叉和管道
- 16. 如何從多個子進程分叉和讀取?
- 17. 重用子進程對象
- 18. 將分叉的進程輸出重定向到父進程C
- 19. 子類和 「促進」 對象
- 20. C - 使用管道,選擇,分叉和execl創建進程樹
- 21. 與分叉進程混淆?
- 22. longjmp從分叉進程
- 23. 分叉管道子流程
- 24. 爲什麼分叉的子進程在我分叉後立即退出?
- 25. 如何殺死python中的分叉子及其jackd子進程
- 26. 分叉多個孩子,等到孩子進程死亡
- 27. C++管道和叉子
- 28. C中的叉子和PID
- 29. 是否有一個與D中的子進程分叉和通信的例子?
- 30. 分叉在Python子進程下的多個應用程序
標籤確實會說「Linux」,所以平臺是相對特定的。好的例子與緩衝輸出。 –
@Kerrek:除了新版本的Linux + g ++可以輕易改變細節。這實際上取決於運行時如何與內核交互。例如,你知道在fork()中futex發生了什麼嗎?我不... – Nemo
呵呵 - 有人嗎? :-)引用如下:「父進程的整個虛擬地址空間在子進程中複製,包括互斥狀態,條件變量和其他pthreads對象的狀態」,但不知道是否包含futexes ... –