作者pili100 (zelda)
看板C_and_CPP
標題[問題] 共享函式庫全域變數
時間Fri Jan 23 15:42:32 2015
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
linux gcc
問題(Question):
很突然地想到,如果我寫一個函式庫,裡面有一個全域變數,
當有兩個以上的程式做存取變更的話,會怎樣
所以自己寫了一個測試程
程式碼(Code):(請善用置底文網頁, 記得排版)
共享函式庫share.c
//內容就只是存放變數
int share = 100;
然後編譯指令
gcc share.c -shared -fpic libshare.so
測試程式碼
#include <stdio.h>
extern int share;
int main(){
printf("address is %x,and value=%d", &share, share);
//share = 101;
//printf("address is %x,and value=%d", &share, share);
getchar();
return 0;
}
補充說明(Supplement):
當我用一樣的程式碼,編出兩個執行檔,只是檔名不同而已
結果share的位址是一樣的
若其中一個把註解拿掉再編
位址就不是同一個
這裡產生的困惑是共享函式庫程式在記憶體是只有一份
函式應當沒什麼問題,但是變數呢
是程式各自保留一份
像java物件一樣
還是說我想測試的語法根本就搞錯了
希望高手出面幫忙解說一下
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.209.145
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1421998957.A.472.html
推 Bencrie: process 各自持有自己的變數啊 01/23 16:25
→ Bencrie: 你想要那個效果的話請找 shared memory 01/23 16:28
→ wenyonba: 如果 process 或 thread 用共用全域變數 01/23 16:59
→ wenyonba: 好像要在 DllMain 裡面不知道怎麼搞,有點忘記了... 01/23 16:59
→ Killercat: .so只有程式碼跟const部分共用 heap/stack都是分開的 01/23 16:59
→ shadow0326: 位子一樣是因為那個位址是相對位址 剛好一樣而已 01/23 17:10
→ pili100: 原來是剛好相對位址一樣,我該重修作業系統了 01/26 09:53