2014-03-01 54 views
1

在Linux中,如果父進程具有任何數據結構(例如,樹,列表),那麼子進程繼承的是那些數據結構?我的意思是,孩子是否可以訪問相同的數據結構(指向該數據結構的任何類型的指針)?子進程是否繼承父進程的數據結構?

回答

4

如果您在討論fork()之後的Linux/Unix進程,是的。他們得到他們自己的父進程的數據副本,所以無論他們中的哪一個在fork之後都看不到另一個(通常通過寫時複製來實現),所以內存頁不會被複制,直到寫入,但這是用戶程序沒有看到的細節)。

如果您在談論Windows啓動一個新進程CreateProcess(),否,新進程不會從父進程繼承任何數據結構。


這兩者都與您使用的操作系統有關,而不是使用任何特定的編程語言。

+0

(linux),子進程獲取數據結構的副本還是獲取數據結構的新數據結構(例如樹)。 – user2831683

+0

如果用「其新數據結構」表示一棵空樹,而父樹有一些條目 - 不。孩子的數據空間是分岔時父母的數據空間的精確副本。所以這是一個新的數據結構,因爲它是一個副本,而不是原始數據結構,如果您修改子進程的副本,那麼父進程不會注意到。但是,在fork之後,其中一個進程會更改內容,數據結構的內容將完全相同。 –

+0

是否有任何方法可以使其中的更改反映在另一個 – user2831683

2

假設你正在使用類似fork()創建子進程,他們會繼承一切的全球對實際父進程的背景:

  • 設置環境變量
  • 打開文件描述符
  • 等等

全局範圍變量將複製給孩子pr從他們實際所在的狀態中獲取背景。將這些變量的變化不會在中體現出來。

如果要在父級和子級進程之間進行通信,請考慮使用pipesshared memory

+0

yes fork();子進程將訪問相同的數據結構,否則它將獲得該數據結構的副本 – user2831683

+0

@ user2831683沒有副本!只需參考,在訪問此類數據時應注意競爭條件。 –

+0

因此,如果我在子進程中對數據結構進行一些更改,那麼這些更改也將用於父進程 – user2831683