關於linux使用動態庫進行程序間通訊

2021-07-04 11:27:19 字數 2113 閱讀 1586

因為之前是用共享記憶體來進行程序間的通訊,這幾天在驗證乙個思路:使用動態庫進行程序間的通訊。

1. 參考了  這篇帖子,建立了乙個動態庫caculate.c 與caculate.h,**如下:

#include "caculate.h"

#include "stdio.h"

int ishare;

//求兩個數的和

int add(int a, int b)

//減法

int sub(int a, int b)

//除法

int div(int a, int b)

//乘法

int mul(int a, int b)

/*caculate.h*/

#ifndef caculate_head_

#define caculate_head_

//加法

int add(int a, int b);

//減法

int sub(int a, int b);

//除法

int div(int a, int b);

//乘法

int mul(int a, int b);

extern int ishare;

#endif

建立乙個test.c檔案

#include #include "caculate.h"

int iadd;

int main()

執行編譯語句:

gcc -shared -fpic caculate.c -o libcac.so

gcc test.c ./libcac.so -o test

每次執行 ./test 發現執行處都是

the ishare in test.c is 10

這說明這個全域性變數沒有被改變。

2. 後來在caculate.c中假如了如下的內容:

#pragma data_seg ("shareddate")

/*hwnd shareddate = null*/

int ishareinseg = 1;

#pragma data_seg

#pragma comment(linker, "/section:shareddate,rws")

並且構造了兩個函式,用來在caculate.c中進行讀寫,

//返回共享資料

int getdata()

//設定共享資料

void setdata(int tmpdata)

修改test.c中的內容,執行程式,發現和之前一樣,並不能修改全域性變數。

3.  參考

這篇文章上提到:「這個文章上面說,如果想依靠動態庫來共享全域性變數恐怕是不可能的事情,因為不同程序訪問動態庫時,

是寫拷貝的,即如果另乙個程序試圖去修改動態庫中的全域性變數時,系統就會把這個全域性變數拷貝乙份單獨給這個程序,而這個修改操作並不會影響到其他程序中的變數的值.」 並且這篇文章提供了個測試例程,和上面的差不多,驗證了全域性變數的不可實現。

4. 參考

這篇文章也提到:"win16環境中,dll的全域性資料對每個載入它的程序來說都是相同的;而在win32環境中,情況卻發生了變化,dll函式中的**所建立的任何物件(包括變數)都歸呼叫它的執行緒或程序所有。當程序在載入dll時,作業系統自動把dll位址對映到該程序的私有空間,也就是程序的虛擬位址空間,而且也複製該dll的全域性資料的乙份拷貝到該程序空間。也就是說每個程序所擁有的相同的dll的全域性資料,它們的名稱相同,但其值卻並不一定是相同的,而且是互不干涉的。" 它上面提供的例程和上面的例程類似,證明了並不能用這種方式進行程序間通訊。這篇文章還提到了一本書《程式設計師的自我修養-鏈結,裝載與庫》,希望能好好讀讀。

5. 總結

用動態庫的方式進行程序間的通訊貌似行不通啦。。。。繼續回歸共享記憶體的方式,難怪這麼多教材上提到的程序間通訊,都沒有提到用動態庫的方式。咱們親愛的csdn問答機械人給了乙個鏈結哈哈。。。。程式設計尚未成功,同志仍需努力哈!

使用 bc 進行進製轉換

使用 bc 進行進製轉換 在 shell 中進行進製轉換的另乙個訣竅是使用bc,它是一種任意精度運算語言,大多數 unix linux 安裝程式都提供。因為它允許您指定輸出進製,所以當您需要以十進位制以外的進製輸出時,這是一種很好的技術。bc的特殊變數ibase和obase分別包含用於輸入和輸出的進...

使用test命令進行進行條件測試

使用test命令進行進行條件測試 格式 test conditions test在以下四種情況下使用 a.字元比較 b.兩個整數值的比較 c.檔案操作,如檔案是否存在及檔案的狀態等 d.邏輯操作,可以進行and or,與其他條件聯合使用 a.測試字元資料 shell變數通常均作為字元變數 str1 ...

Linux 關於靜態庫和動態庫

為什麼要使用庫?如何使用庫 靜態庫與動態庫 查詢c標準靜態庫 find usr lib name libc.a查詢c標準動態庫 find usr lib name libc.so 如何給別人提供乙個靜態庫 首先要自己提供一套方法,然後打包。就以add函式和sub函式為例,說明如何給別人提供乙個靜態庫...