天天看點

關于linux使用動态庫進行程序間通訊

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

關于動态庫與靜态庫的差別以及動态庫的一些特征,這裡就不說了,網上很多,百度即可。這裡隻說說本人的整個研究過程。

1. 參考了 http://www.cnblogs.com/Anker/p/3527677.html  這篇文章,建立了一個動态庫caculate.c 與caculate.h,代碼如下:

//caculate.c
#include "caculate.h"
#include "stdio.h"

int iShare; 

//求兩個數的和
int add(int a, int b)
{
    return (a + b);
}
//減法
int sub(int a, int b)
{
    return (a - b);
}
//除法
int div(int a, int b)
{
    return (int)(a / b);
}
//乘法
int mul(int a, int b)
{
    return (a * 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 <stdio.h>
#include "caculate.h"

int iAdd;

int main()
{
    int a = 20;
    int b = 10;
	printf("\n--------------------------Begin the test---------------------------------\n");
	
    printf("%d + %d = %d\n", a, b, add(a, b));
    printf("%d - %d = %d\n", a, b, sub(a, b));
    printf("%d / %d = %d\n", a, b, div(a, b));
    printf("%d * %d = %d\n", a, b, mul(a, b));
	printf("--------------\n");
	
	iShare += 10;
	printf("the iShare in test.c is %d\n", iShare);
	printf("--------------\n");
	
	printf("-----------------------------End the test---------------------------------\n\n");
    return 0;
}
           

執行編譯語句:

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()
{
	return iShareInSeg;
}

//設定共享資料
void SetData(int tmpData)
{
	iShareInSeg = tmpData;
}
           

修改test.c中的内容,運作程式,發現和之前一樣,并不能修改全局變量。

3.  參考 http://www.cnblogs.com/lovevivi/archive/2013/01/10/2854584.html

     這篇文章上提到:“這個文章上面說,如果想依靠動态庫來共享全局變量恐怕是不可能的事情,因為不同程序通路動态庫時,

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

4. 參考 http://blog.csdn.net/zxh821112/article/details/8969541

     這篇文章也提到:"Win16環境中,DLL的全局資料對每個載入它的程序來說都是相同的;而在Win32環境中,情況卻發生了變化,DLL函數中的代碼所建立的任何對象(包括變量)都歸調用它的線程或程序所有。當程序在載入DLL時,作業系統自動把DLL位址映射到該程序的私有空間,也就是程序的虛拟位址空間,而且也複制該DLL的全局資料的一份拷貝到該程序空間。也就是說每個程序所擁有的相同的DLL的全局資料,它們的名稱相同,但其值卻并不一定是相同的,而且是互不幹涉的。" 它上面提供的例程和上面的例程類似,證明了并不能用這種方式進行程序間通信。這篇文章還提到了一本書《程式員的自我修養-連結,裝載與庫》,希望能好好讀讀。

5. 總結

     用動态庫的方式進行程序間的通信貌似行不通啦。。。。繼續回歸共享記憶體的方式,難怪這麼多教材上提到的程序間通信,都沒有提到用動态庫的方式。咱們親愛的CSDN問答機器人給了一個連結http://blog.csdn.net/zhiweiyouzhishenghuo/article/details/7743212,哈哈。。。。程式設計尚未成功,同志仍需努力哈!

繼續閱讀