[英]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.