2011-09-01 54 views
0

假設有一個程序將動態加載兩個共享庫,並且在庫A中分配了一條消息。我想知道庫B是否可以使用該消息。在linux中的不同共享庫中的數據可見性

編輯:由於它只是在設計階段,沒有「真正的代碼」。

共享庫甲

void process() 
{ 
msg_ptr = new message(); 
send(msg_ptr); //send the msg address to library B 
} 
共享庫乙

void process() 
{ 
recv(msg_ptr); // at this point how can library B access the msg address 
} 
+0

共享庫或共享內存? –

+0

給出一些示例代碼片段 –

+0

它是共享庫。 –

回答

1

(編輯):好,問題是有些混亂,因爲sendrecv暗示進程間通信和它似乎並非如此,所以:

簡答:是的,無論哪個庫,靜態或動態,分配沒有關係。它始終是整個流程。

共享庫意味着代碼一次存儲在磁盤上,但在運行時並不意味着什麼(這會影響使用)。

分配不關心它是從庫還是應用程序代碼完成的。每個進程只有一個堆,它從中進行所有分配。該堆可以在該進程的上下文中運行的所有代碼訪問,並且任何其他進程都不可訪問(即使使用相同的代碼)。實際上,operator new本身位於另一個共享庫(libstdc++.so)中,它只是從另一個共享庫(libc.so)調用malloc。每個共享庫在每個進程中只出現一次,即使有多個其他共享庫依賴於它(這在Windows的某些特定情況下可能會有所不同)。

在運行時,一個地址空間中的指針永遠不會在另一個進程的地址空間中有效,因此在進程間消息中傳遞指針是毫無意義的。儘管在同一過程的不同線程之間完全可以。

+0

由於應用程序加載兩個共享庫,我認爲它位於該應用程序中的相同地址空間中。 –

+0

@Michael D:號碼地址空間是一個表格,說明應該在哪個地址。該表對於每個過程是完全獨立的。另外,正如我所說的,'new'從堆中分配,這對於進程是完全私有的(共享庫沒有自己的堆,進程可以)。 –

+0

是的。所以如果一個應用程序(即一個進程)加載兩個共享庫,那麼堆是共享的,對吧? –