簡體   English   中英

fork(),共享 memory 和 C 中的指針

[英]fork(), shared memory and pointers in C

我無法在共享 memory 的進程之間共享指向 object 的指針。

我可以在不同進程之間成功共享如下結構:

    // Data to be shared among processes
    struct Shared_data {
        int setPointCounter;
        struct Point old_point;
        pthread_mutex_t my_mutex;
    } *shd;

該結構被聲明為全局(假設它位於 main() 之前)。

我將共享的 memory 初始化為 main:

shd = (struct Shared_data *) (mmap(NULL, sizeof *shd, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0));

然后在某個時候我做了一個 fork()。 它工作正常。

當我不得不分享這樣的事情時,問題就出現了:

    // Data to be shared among processes
    struct Shared_data {
        int setPointCounter;
        struct Point old_point;
        MyObject *obj;
        pthread_mutex_t my_mutex;
    } *shd;

我主要從第三方庫調用 function,它返回指向 MyObject 類型的 object 的指針,我想以某種方式分享它。 我怎樣才能做到這一點?

通過在 web 上搜索,我發現了一些與相對指針相關的內容,但我不確定它是否會起作用,同時,我不知道如何以正確的方式進行操作。

我正在研究 Linux(Slackware 64 14.2),語言是 C/C++(實際上主要是 C)。

提前感謝您的寶貴時間。

基本上,指針是一個進程的虛擬空間中某些數據的地址。 您不能在進程之間共享指針,因為這些指針將在不同的地址空間中解釋(通常,這也適用於 kernel 模式虛擬空間和同一進程的用戶模式)。 讓我們舉個例子……您已經進行了一些分配(在它們之間您已經進行了mmap(2)分配),然后您fork(2)另一個進程。 在那之前,所有 memory 地址都指向同一個地方,如果我們認為這兩個進程在分叉之前就已經存在,那么它們會做同樣的事情,得到相同的結果,等等。

但是一旦兩個進程彼此分離,一個進程中的所有分配可能與另一個進程中的相同分配不同,因為每個進程的不同歷史可能會提供來自任何分配器的不同結果。 只需假設任務中的一些時間順序和一些時間相關的 state 變化......之后,兩個進程的狀態將不同。

現在讓我們假設您在一個進程中有一個指針,它指向您想要與另一個共享的數據結構。 但是另一個進程甚至沒有分配相同的東西......因此將例如0x00456211ff傳遞給另一個進程將指向另一個進程中沒有分配任何內容的位置(導致SIGSEGV信號和進程中止)

一旦進程轉移它們的虛擬空間存儲不同的東西,並且一個空間中的虛擬指針在另一個進程中是不可解釋的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM