2009-08-25 48 views

回答

0

如上所述,命名管應該爲你做。您可以使用兩個管道(如果可能):

  1. parentpid_childpid - 家長寫和孩子在讀
  2. childpid_parentpid - 孩子寫和讀parebt。

這適用於我。請提一下,如果您有任何特殊的會議考慮。

2

這個article是共享內存的一個非常好的起點。

但是,我建議您一般使用管道,以避免競爭條件和併發的所有心理開銷。當你打開一個子進程時,它的stdin和stdout就是你可以從父進程讀寫的文件描述符。

+0

對不起,這是我的軟件中一個小而重要的部分,我需要能夠儘可能快地交換數據集。 不,我並不害怕併發和競爭條件。我喜歡高速併發編程。但是在這裏,我必須調用外部子進程,因爲它可能會加載不應該能夠使主應用程序崩潰的不安全插件。 – Lothar 2009-08-25 10:32:41

+2

聽起來就像你處於最重要的事情,我鏈接的文章將是有道理的。 您最終會將父節點從共享緩衝區中讀取的任何內容複製到父節點私有的緩衝區中,然後驗證它,顯然。在某些時候,你會嘗試在用戶環境中使用管道爲你做什麼,並且你可能不會發現管道本身就很慢。 – Will 2009-08-25 10:41:03

0

分配父內存。 在父母和孩子中使用此內存。 給父母釋放記憶的責任。 讓孩子等待(等待系統調用)。 父級在退出前釋放內存。

另一種方法是在安全的一面,在孩子退出前檢查父母是否存活。 如果沒有,請釋放孩子本身的內存。但如果可能有多個孩子,則這將不起作用。

您可以使用前幾位內存來跟蹤使用此內存的進程數量。每當一個進程開始使用內存時,它會增加此計數,並在退出之前遞減計數。如果計數變爲0,則釋放內存。

還有另一種方法。寫一個函數ownMalloc,它位於系統malloc之上(或者你使用的任何函數)。這會跟蹤所有分配的內存以及使用它的進程。它定期檢查分配的不同塊並釋放未使用的塊。

1

Mmap通常支持不創建垃圾的「匿名」模式。它在LInux上工作,根據Solaris上的手冊頁,我不確定FreeBSD - 查看手冊頁並搜索MAP_ANON或MAP_ANONYMOUS。

+1

我應該在MAP_ANONYMOUS之前添加一個用於通過在mmap之後立即取消鏈接()該文件的技巧。這允許父進程和子進程使用共享內存。 – ondra 2009-08-25 10:44:20

+0

嗯,如果我使用MAP_ANONYMOUS什麼文件描述符應該通過,如果不是一個文件?好吧,我可以嘗試生成一個「/ tmp/dummy」文件,只是爲了使用句柄(其中沒有數據寫入)。但它仍然留下一些垃圾。 – Lothar 2009-08-25 12:27:27

+0

當使用'MAP_ANONYMOUS'時,您傳遞'-1'作爲文件描述符。 – caf 2009-08-25 12:49:50

0

使用POSIX shm_open(3)和相關函數映射未由文件支持的內存。如果父節點和子節點不存在,應該自動關閉由shm_open()返回的文件描述符,但是我不能100%確定是否總是這樣。也許別人可以更多地瞭解這一點?

+0

對不起「shm」,posix信號量在FreeBSD上非常糟糕(shm按設計 - 正如我在FreeBSD郵件列表中的對話後發現的那樣)。 – Lothar 2009-08-25 12:12:52

0

在父進程中分配內存,繼續等待子進程執行或讓他執行一些其他任務。一旦子進程結束,它將返回到父進程,釋放那裏的內存。

如果父進程需要在子進程之前停止(在這種情況下,子進程被認爲是孤兒),然後使用exec()將啓動子進程作爲新進程。

相關問題