因為之前是用共享記憶體來進行程序間的通信,這幾天在驗證一個思路:使用動态庫進行程序間的通信。
關于動态庫與靜态庫的差別以及動态庫的一些特征,這裡就不說了,網上很多,百度即可。這裡隻說說本人的整個研究過程。
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,哈哈。。。。程式設計尚未成功,同志仍需努力哈!