2012-08-03 45 views
2

我很好奇從具有大部分標誌設置的進程調用克隆的行爲(這樣兩個進程共享一個執行上下文,即共享地址空間,文件描述符,等等)。我無法使用在線材料完全回答我的問題。克隆,fork,vfork行爲後面跟一個exec

現在假設我從克隆過程調用execve。這會用一個全新的進程替換進程的映像,破壞連接的內存段,丟棄分配的內存等,但是父進程會發生什麼?鑑於這些共享(例如,所有的malloced內存區域),它們是否也被釋放?

新的execved進程是否仍然與父級共享一個地址空間?

+0

clone在Linux中用於實現線程創建('pthread_create')和進程創建('fork')。 'execve'取代了整個過程。 – 2012-08-03 09:04:54

回答

1

共享對象未映射或未鏈接,但是從共享的角度來看。

假設你有3個進程/線程,它們都從0x1000開始共享內存。

其中之一是一個execve。然後它會在0x1000上執行shm_unlink(2)shm_unlink(2)會嘗試unlink(2)它。

現在對於每個使用該存儲器範圍的進程/線程都有一個計數器。在我們的例子中,計數器在execve(2)之前被設置爲3,並且在它之後它將被設置爲2。沒有記憶損失。

當你沒有進程使用它時,內存將被「銷燬」。當計數器爲0.

同樣適用於所有共享對象。有關調用哪些系統調用以及它們如何「銷燬」共享對象的列表,請查看execve(2)manpage中的鏈接。搜索這個短語:

All process attributes are preserved during an execve(), except the following 
+0

我明白了。我不清楚內存是被釋放還是根本沒有鏈接。現在以另一種方式翻轉它:如果execved進程執行malloc並以某種方式將其傳遞給父進程,那麼父進程能夠通過指向該地址的指針來訪問它(參見:即使我已經調用execve ,他們是否繼續共享相同的內存地址空間,就像他們在克隆之前但在execve之前一樣?)? – user1018513 2012-08-03 09:54:51

+1

如果我正確理解你的問題,答案是否定的。如果execve(2)成功執行,您將獲得一個新進程。不是新線程。所以不會有共享地址空間。 – 2012-08-03 10:04:28

+0

因此,這意味着無法在同一地址空間內運行兩個二進制文件? (假設他們都是可信的) – user1018513 2012-08-03 11:51:15

0

父進程不受execve的影響。畢竟這是一個不同的過程。進程總是必須使用一些明確的方法進行通信(文件,管道,IPC,如共享內存,信號......)。由於所有這些在執行執行官的孩子中被摧毀,所以直到再次明確地設置後纔可能進行通信。

+0

是的,但如果你只是使用克隆,你可以簡單地通過共享指針進行通信(假設你使用CLONE_VM標誌集的克隆) – user1018513 2012-08-03 09:52:59

+0

但是如何在execve *後沒有共享指針*的時候這樣做?我們中的一個人誤解了execve的作用......是我嗎? – Jens 2012-08-03 15:30:41